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



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

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

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

这种情况经常发生。答案是,你需要将你的形状投射到一个圆圈中才能访问方法

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

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

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

除了其他答案建议的强制转换解决方案外,如果您认为Shape的所有子类都应该提供该方法,但您不能/不想在Shape上实现它,则可以将该方法声明为抽象方法,并在CircleRectangle中实现该方法。

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

public class Circle extends Shape {
public void foo() {
// Implementation
}
}

那么你可以做:

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

最新更新