在Java中调用一个子类的方法

如果我有一个基类Base thing = null; 其中有一个子class Subclass extends Base ,我鼓励它作为thing = new Subclass我怎么会调用一个方法,是专门在子类,但不是在基地? 恩。 Base只有method() Subclassmethod()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”。