Java 如果我的子类也有不同的方法呢?
我有一个关于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
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
实例在程序上下文中使用该方法有意义,则初始化。如果该方法不适合形状
,您可以使用其他答案中提供的铸造方法。它是否“有意义”很可能是特定于您的问题领域的设计决策,而不是实现决策。