我有一个关于Java中多态性的问题。我有一个抽象基类Shape
和两个派生类Rectangle
和Circle
。我知道我可以用Shape
类引用调用Circle
和Rectangle
类中的重写方法,但如果我有一个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
上实现它,则可以将该方法声明为抽象方法,并在Circle
和Rectangle
中实现该方法。
public abstract class Shape {
public abstract void foo();
}
public class Circle extends Shape {
public void foo() {
// Implementation
}
}
那么你可以做:
Shape s = new Circle();
s.foo();