2010-04-23 127 views
9

如果我有一个基类,它 Base thing = null; 的还有一个子类 class Subclass extends Base 我鼓动它作为 thing = new Subclass 我将如何调用就是专门在子类的方法,但不在基地? ex。 Base只有method() Subclass已经method()specialMethod() 方法specialMethod()是一个我想打电话。调用子类的方法,在Java中

+2

这通常是一个坏主意。如果你知道这个对象是Subclass类型的,那就把它称为那个,你没问题。如果该方法真的属于Base - 将其放入Base中。 – 2010-04-23 18:56:25

回答

12

如果你知道thing包含Subclass,你可以这样做:

((Subclass) thing).specialMethod() 
+6

请注意,如果事物不是'Subclass',则会用'ClassCastException'炸弹......如果您不确定,请使用'instanceof'来检查'thing'是否是'Subclass'。 – Powerlord 2010-04-23 18:55:38

1

您必须键入或铸事情的子类。所以:

 Subclass thing = new Subclass(); 

或:

 ((Subclass) thing).specialMethod(); 
7

你必须cast它能够调用的方法:

Base thing = new SubClass(); 

((SubClass) thing).specialMethod(); 

如果您遇到这种情况,很可能是你不这样做有正确的界面(正确的方法)

在深入到舞台之前你开始验证一切都知道,如果你可以调用一个方法或不喜欢:

public void x (Base thing) { 
    if(thing.instanceof Subclass) { 
     ((SubClass)thing).specialMethod(); 
    } 
} 

考虑一下,如果你不需要移动specialMethod起来层级,所以它属于基地。

如果你肯定不需要它的基础,但你需要在子类中至少要考虑使用正确的类型:

SubClass thing = ... 
// no need to cast 
thing.specialMethod(); 

但一如既往,这取决于什么是你想做。

+0

'if'语句应该可能有'else' ... – 2010-04-23 19:04:28

3

当继承/多态性Java的处理有两种基本类型强制转换中您可以看到:

上溯造型:

Superclass x = new Subclass(); 

这是隐含的,不需要硬铸铁因为Java知道Superclass可以做的一切,Subclass也可以做。

溯造型

Superclass x = new Subclass(); 

Subclass y = (Subclass) x; 

在这种情况下,你需要做一个硬铸铁因为Java是不是很确定这是否会工作或没有。你必须通过告诉它你知道你在做什么来安慰它。原因是因为子类可能有一些超类没有的奇怪方法。一般来说,如果你想实例化一个类来调用它的子类中的某些东西,你应该实例化子类以开始 - 或者确定该方法是否也应该在超类中。

16

其他人已经提到过如何投掷物体以获得对您问题的回答,但先问这个问题指出了可能的设计问题。一些可能的原因:

+1

只是将其更改为“可能的设计问题”,我完全同意。 – David 2010-04-23 22:41:14

0

另一种方法可能是做到以下几点:

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从子类”。