如果我有一个基类,它 Base thing = null;
的还有一个子类 class Subclass extends Base
我鼓动它作为 thing = new Subclass
我将如何调用就是专门在子类的方法,但不在基地? ex。 Base
只有method()
Subclass
已经method()
和specialMethod()
方法specialMethod()
是一个我想打电话。调用子类的方法,在Java中
回答
如果你知道thing
包含Subclass
,你可以这样做:
((Subclass) thing).specialMethod()
请注意,如果事物不是'Subclass',则会用'ClassCastException'炸弹......如果您不确定,请使用'instanceof'来检查'thing'是否是'Subclass'。 – Powerlord 2010-04-23 18:55:38
您必须键入或铸事情的子类。所以:
Subclass thing = new Subclass();
或:
((Subclass) thing).specialMethod();
你必须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();
但一如既往,这取决于什么是你想做。
'if'语句应该可能有'else' ... – 2010-04-23 19:04:28
当继承/多态性Java的处理有两种基本类型强制转换中您可以看到:
上溯造型:
Superclass x = new Subclass();
这是隐含的,不需要硬铸铁因为Java知道Superclass
可以做的一切,Subclass
也可以做。
溯造型
Superclass x = new Subclass();
Subclass y = (Subclass) x;
在这种情况下,你需要做一个硬铸铁因为Java是不是很确定这是否会工作或没有。你必须通过告诉它你知道你在做什么来安慰它。原因是因为子类可能有一些超类没有的奇怪方法。一般来说,如果你想实例化一个类来调用它的子类中的某些东西,你应该实例化子类以开始 - 或者确定该方法是否也应该在超类中。
其他人已经提到过如何投掷物体以获得对您问题的回答,但先问这个问题指出了可能的设计问题。一些可能的原因:
- 该方法是在错误的地方。
- 调用该方法的代码位于错误的位置。
- 子类不应该扩展其他类。最好到prefer composition over inheritance。当继承时,代码应该遵循Liskov substitution principle。
- 这些课程是non-cohesive,他们有超过one responsibility,他们应该分成多个类。
只是将其更改为“可能的设计问题”,我完全同意。 – David 2010-04-23 22:41:14
另一种方法可能是做到以下几点:
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从子类”。
- 1. 调用子类方法的Java
- 2. 从Java子类中调用的方法不是在父类
- 3. Java的继承:在超类中调用子类方法
- 4. 在java中调用父类型时调用子方法
- 5. Java继承:在超类中调用子类方法
- 6. 在子类对象上调用父类的方法java
- 7. 调用子类的方法
- 8. java - 被调用的子类中的覆盖方法
- 9. 主类中的Java调用方法
- 10. 调用方法在UIView的子类
- 11. 调用继承中的子类方法
- 12. 从子类调用ViewController中的方法
- 13. 从子类中的重载方法调用基类方法
- 14. 多线程中的Java调用子类方法
- 15. 调用超类方法后调用子类方法
- 16. 子类调用父类的方法
- 17. 在java中调用方法
- 18. 如何在Python中的超类中调用子类方法
- 19. 无法在java中的类中调用void方法
- 20. 在Java中调用方法的类的查找类型
- 21. 从java类中调用RFT方法
- 22. Python - 调用方法在子类
- 23. 从子类中调用方法
- 24. 在Perl中调用基类的子类方法
- 25. Java中的调用方法
- 26. 从超类调用子类方法
- 27. Actionscript:从子类调用超类方法
- 28. 调用类子方法而不是它的孙子方法
- 29. 无法从活动类中调用java类的方法
- 30. 的Java类方法,方法调用()和原始类型
这通常是一个坏主意。如果你知道这个对象是Subclass类型的,那就把它称为那个,你没问题。如果该方法真的属于Base - 将其放入Base中。 – 2010-04-23 18:56:25