Java 如果我的子类也有不同的方法呢?

Java 如果我的子类也有不同的方法呢?,java,class,oop,inheritance,polymorphism,Java,Class,Oop,Inheritance,Polymorphism,我有一个关于Java中多态性的问题。我有一个抽象基类Shape和两个派生类Rectangle和Circle。我知道我可以使用Shape类引用调用Circle和Rectangle类中重写的方法,但是如果我有一个Shape类没有但Circle类有的方法怎么办。在这种情况下如何使用多态性?这种情况经常发生。答案是,你需要将你的形状铸造成一个圆来访问这个方法 Shape s = ...; if (s instanceof Circle) { ((Circle)s).foo(); //method o

我有一个关于Java中多态性的问题。我有一个抽象基类
Shape
和两个派生类
Rectangle
Circle
。我知道我可以使用
Shape
类引用调用
Circle
Rectangle
类中重写的方法,但是如果我有一个
Shape
类没有但
Circle
类有的方法怎么办。在这种情况下如何使用多态性?

这种情况经常发生。答案是,你需要将你的形状铸造成一个圆来访问这个方法

Shape s = ...;
if (s instanceof Circle) {
  ((Circle)s).foo(); //method only on Circle
}

如果将圆存储在形状实例中,则可以通过将s强制转换为圆来调用s上的圆方法:

Shape s = new Circle();
...
if ( s.instanceof(Circle) ) {
   ((Circle)s).circleMethod();
}

除了其他答案所建议的铸造解决方案外,如果您认为
Shape
的所有子类都应该提供该方法,但是您不能/不想在
Shape
上实现它,那么您可以将该方法声明为抽象方法,并在
圆圈
矩形
中实现该方法

public abstract class Shape {
    public abstract void foo();
}


public class Circle extends Shape {
    public void foo() {
        // Implementation
    }
}
然后你可以做:

Shape s = new Circle();
s.foo();

在这种情况下不能使用多态性。多态性的基本思想是,无论对象的实际形状(特定对象类型)如何,都可以以指定的方式使用对象。通过要求访问特定形状所特有的方法,您必须放弃多态性


(如果
Circle
实际上有子类,则上述参数将不适用,在这种情况下,您可以多态地调用这些方法,但这只是将参数移动到其他地方。)

如果我有一个Shape类没有但Circle类有的方法该怎么办。
-您不能使用
Shape
的引用直接调用此方法。但是如果Circle类有Shape类没有的另一个方法该怎么办?然后您可以向
Shape
添加一个具有相同签名的抽象方法声明如果
Shape
实例在程序上下文中使用该方法有意义,则初始化。如果该方法不适合
形状
,您可以使用其他答案中提供的铸造方法。它是否“有意义”很可能是特定于您的问题领域的设计决策,而不是实现决策。