在Java中调用一个子类的方法
如果我有一个基类Base thing = null;
其中有一个子class Subclass extends Base
,我鼓励它作为thing = new Subclass
我怎么会调用一个方法,是专门在子类,但不是在基地? 恩。 Base
只有method()
Subclass
有method()
和specialMethod()
方法specialMethod()
是我想要调用的方法。
其他人已经提到如何投掷物体来获得你的问题的答案,但首先提出这个问题指出了一个可能的devise问题。 一些可能的原因:
- 该方法是在错误的地方。
- 调用方法的代码在错误的地方。
- 子类不应该扩展其他类。 最好比inheritance更喜欢构图 。 而inheritance时,代码应该遵循Liskovreplace原则 。
- 这些课程是非内聚的 ,他们有多个责任 ,他们应该分成多个class级。
如果你知道这个thing
包含一个Subclass
,你可以这样做:
((Subclass) thing).specialMethod()
你必须cast
它能够调用该方法:
Base thing = new SubClass(); ((SubClass) thing ).specialMethod();
如果你面对这种情况,很可能你没有正确的界面(正确的方法)
在深入到你开始validation所有东西的阶段之前,要知道你是否可以调用方法,或者不喜欢:
public void x ( Base thing ) { if( thing.instanceof Subclass ) { ((SubClass)thing).specialMethod(); } }
考虑如果你不需要在层次结构中移动specialMethod
,那么它就属于基础。
如果你确实不需要它的基础,但你至less需要考虑在子类中使用正确的types:
SubClass thing = ... // no need to cast thing.specialMethod();
但一如既往,这取决于你想要做什么。
在Java中处理inheritance/多态时,基本上有两种types的强制转换:
上溯造型:
Superclass x = new Subclass();
这是隐含的,不需要硬性转换,因为Java知道Superclass
可以做的所有事情, Subclass
也可以做到。
溯造型
Superclass x = new Subclass(); Subclass y = (Subclass) x;
在这种情况下,你需要做一个强硬的转换,因为Java不太确定这是否可行。 你必须通过告诉它你知道你在做什么来安慰它。 原因是因为子类可能有一些超类没有的奇怪的方法。
一般来说,如果你想实例化一个类来调用其子类中的某个东西,你应该实例化一下子类,或者确定该方法是否也应该在超类中。
你必须input,或者把东西投给子类。 所以:
Subclass thing = new Subclass();
要么:
((Subclass) thing).specialMethod();
另一种方法可能是执行以下操作:
public abstract class Base { //method() not implemented public abstract void specialMethod(); } public class Subclass extends Base { //method() not implemented @Override public void specialMethod() { //put your code here System.out.println("specialMethod from Subclass"); } }
所以你可以这样做:
thing.specialMethod();
它会给你:“从子类specialMethod”。