我有关于继承和绑定的问题。
如果我在子类中创建一个新方法,并尝试使用超类引用调用它,该怎么办?
我知道它会首先检查类型,然后检查对象。 因此,根据规则,这不起作用,因为此方法未在超类中声明。
但是没有办法克服它吗?
我的意思是继承意味着你必须在超类中声明每一个方法,如果你想为子类改变一些东西,你只能覆盖它吗? 所以,如果我突然意识到,我的一个子类确实需要一个特殊的方法,或者需要重载,那么我是否会被迫先在超类中声明它或者完全忘记它?
答案 0 :(得分:1)
因此,如果我突然意识到,我的一个子类确实需要一个 特殊的方法,或需要超载,然后我被迫 首先在超类中声明它或者完全忘记它?
还有第三种选择。在子类中声明方法。在需要调用该方法的代码中,将引用强制转换为子类类型。如果引用没有真正指向该子类的对象,则会得到ClassCastException。
如果你最终不得不做这种事情,你应该在下一次重构过程中再看看它,看看它是否可以被平滑掉。
public class Test {
public static void main(String[] args) {
System.out.println(new Test().toString());
Test sub = new TestSub();
System.out.println(sub.toString());
((TestSub)sub).specialMethod();
}
@Override
public String toString(){
return "I'm a Test";
}
}
class TestSub extends Test {
void specialMethod() {
System.out.println("I'm a TestSub");
}
}
答案 1 :(得分:0)
在超类中创建一个抽象方法(并将super更改为抽象类),然后在超类中调用抽象方法。
答案 2 :(得分:0)
扩展DwB的答案:创建一个默认的无操作方法。
public class Super {
public void special() {
// no-op
}
}
public class Sub extends Super {
@Override public void special() {
System.out.println("Now I do something");
}
}