如果我有基类
Base thing = null;
其中有一个子类
class Subclass extends Base
我煽动它
thing = new Subclass
我如何调用特定于Subclass的方法,但不在Base中?
恩。
Base
只有method()
Subclass
有method()
和specialMethod()
方法specialMethod()
是我想要调用的方法。
答案 0 :(得分:16)
其他人已经提到如何投射对象以获得问题的答案,但首先要求提出问题指出可能的设计问题。一些可能的原因:
答案 1 :(得分:15)
如果您知道thing
包含Subclass
,则可以执行以下操作:
((Subclass) thing).specialMethod()
答案 2 :(得分:9)
您必须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();
但与往常一样,这取决于你想做什么。
答案 3 :(得分:3)
在Java中处理继承/多态时,你会看到基本上有两种类型的转换:
<强>向上转型:强>
Superclass x = new Subclass();
这是隐含的,不需要硬拼接,因为Java知道Superclass
可以做的所有事情,Subclass
也可以做。
<强>向下转换强>
Superclass x = new Subclass();
Subclass y = (Subclass) x;
在这种情况下,您需要进行强硬转换,因为Java不太确定这是否有效。你必须通过告诉它你知道你在做什么来安慰它。原因是因为子类可能有一些超类没有的奇怪方法。
一般来说,如果你想实例化一个类来调用它的子类中的东西,你应该只是实例化子类开始 - 或者确定该方法是否也应该在超类中。
答案 4 :(得分:1)
您必须键入或将事物转换为子类。所以:
Subclass thing = new Subclass();
或:
((Subclass) thing).specialMethod();
答案 5 :(得分:1)
另一种方法可能是执行以下操作:
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();
它会给你:&#34;来自Subclass&#34;的specialMethod。
答案 6 :(得分:0)
您可以将要调用的方法作为抽象方法,并将其实现在子类中。然后在您的超类中,像往常一样this.someMethod()
对其进行调用。在运行时,它将转到someMethod()
并运行从子类实现的代码。