继承和公共/私有方法

时间:2015-10-16 13:23:29

标签: java

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,我会得到"两个"作为输出。

这是非常不可预测的,这是如何工作的?

3 个答案:

答案 0 :(得分:6)

run中的Two方法不会覆盖private中的One方法,因为它是private并且One以外的任何类都无法访问public 1}}。

将方法标记为run后,继承系统就会发生,start会在One中调用Two(因为方法未被覆盖),但随后动态(在运行时)解析为run @Override

我的建议是,使用start注释确保在编译时正确覆盖方法。

此外,您似乎正在使用runextend Thread方法:请记住,您需要implement RunnableRunnable让JVM将您的班级识别为{{1 }}第

答案 1 :(得分:1)

在Java中,private方法 NOT 对子类可见。 Protected种方法 ARE

在课程Two中,你覆盖start()方法,因此t.start()使用调用One.start()的{​​{1}}打印"一个"。

如果您将One.run()方法更改为run()publicprotected类将覆盖它,并且调用Two将最终调用声明的版本t.start()

"流程图"形式:
Tworun

  

Two.start() - >没有定义的! - >去超类 - > One.start() - > run() - > One.run()

privaterunpublic

  

Two.start() - >没有定义的! - >去超类 - > One.start() - > run() - > run子()被子类覆盖 - >转到子类 - > Two.run()

答案 2 :(得分:0)

因为在One中run是私有的,所以它不是动态链接的,也不是继承的。在Two中运行不会覆盖One中的运行