One.java
public class One {
private void run() {
System.out.println("one");
}
public void start() {
this.run();
}
}
Two.java
public class Two extends One {
public void run() {
System.out.println("two");
}
}
Main.java
public class Main {
public static void main(String[] args) {
Two t = new Two();
t.start();
}
}
输出:一个
但是,如果我在run
课程中声明public
方法One
,我会得到"两个"作为输出。
这是非常不可预测的,这是如何工作的?
答案 0 :(得分:6)
run
中的Two
方法不会覆盖private
中的One
方法,因为它是private
并且One
以外的任何类都无法访问public
1}}。
将方法标记为run
后,继承系统就会发生,start
会在One
中调用Two
(因为方法未被覆盖),但随后动态(在运行时)解析为run
@Override
。
我的建议是,使用start
注释确保在编译时正确覆盖方法。
此外,您似乎正在使用run
和extend Thread
方法:请记住,您需要implement Runnable
或Runnable
让JVM将您的班级识别为{{1 }}第
答案 1 :(得分:1)
在Java中,private
方法 NOT 对子类可见。 Protected
种方法 ARE 。
在课程Two
中,你不覆盖start()
方法,因此t.start()
使用调用One.start()
的{{1}}打印"一个"。
如果您将One.run()
方法更改为run()
或public
,protected
类将覆盖它,并且调用Two
将最终调用声明的版本t.start()
。
"流程图"形式:
当Two
为run
Two.start() - >没有定义的! - >去超类 - > One.start() - > run() - > One.run()
当private
为run
或public
Two.start() - >没有定义的! - >去超类 - > One.start() - > run() - > run子()被子类覆盖 - >转到子类 - > Two.run()
答案 2 :(得分:0)
因为在One中run是私有的,所以它不是动态链接的,也不是继承的。在Two中运行不会覆盖One中的运行