public class Superclass{
void method1(){
method0();
}
void method0(){
System.out.println("superclass");
}
}
public class Subclass extends Superclass{
void method0(){
System.out.println("subclass");
}
}
public class Runclass{
public static void main(String[] args){
new Subclass().method1();
}
}
此代码打印出来 - 子类。
让它说是
new Superclass().method1();
然后,它将打印出来 - 超类
是调用方法的实例调用依赖方法吗?
答案 0 :(得分:2)
它是Dynamic Method Dispatch
(运行时多态)的一个例子
在Dynamic方法中,在运行时解析被重写方法的调度
当你打电话
new Superclass().method1();
输出为 - superclass
因为Superclass没有关于子类的任何信息
&安培;当你打电话
new Subclass().method1();
输出为 - subclass
因为调用重写方法时,java会根据调用时引用的对象类型确定要执行的方法版本。
答案 1 :(得分:1)
这取决于调用的对象方法。如果在父对象上调用该方法,则将调用parents方法,但如果在子对象上调用该方法,则将调用子类方法。如果不覆盖方法,那么将始终调用父类方法。
答案 2 :(得分:1)
尝试以更好的方式解释它,当一个函数,在method()
中覆盖您的subclass
并且您使用{{1}的实例调用method()
时} superclass
对象不知道被覆盖的superclass
,它将运行自己的method()
版本。事实上,method()
对subclass
所做的任何更改都是superclass
不可见的。因此,superclass
的任何实例都无法访问subclass
被覆盖的method()
{{1}} 1}}。
答案 3 :(得分:0)
<强>多态性。强>
可能你忘了这个
public class Subclass extends ParentClass{
除非你在子类中使用该方法,否则它只调用parent method
。
new Superclass().method1();
这里我的超类实例就是超类method1
调用
如果你打电话
new Subclass().method1();
subclasses
已经过了method1
次来电。
我想建议tutorial以获得清晰的图片。
答案 4 :(得分:0)
Sub 类必须扩展 Super 类:
public class Subclass extends SuperClass{
void method0(){
System.out.println("subclass");
}
}
当调用SubClass().method()
时,调用的优先级将是subClass的方法,输出是
子类
但在这种情况下:
public class Subclass extends SuperClass{
}
输出将是:
超