2015-10-16 197 views
-2

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(); 
    } 
} 

输出:一个

但是,如果我在One类中声明了run方法public,我会得到“two”作为输出。

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

+6

当'''''run '方法是私人的,'两个'不能访问它。当它是'public'时,'Two'中的版本覆盖它。 – JonK

+0

@JonK你不能重写一个私有方法 – ControlAltDel

+0

@ControlAltDel我没有说你可以。 – JonK

回答

6

Tworun方法不会被重写private方法One运行,因为它是private,交通不便外One任何类。

一旦方法被标记为public,继承系统发生,并且runstartOne调用(作为方法没有覆盖),但随后动态解析(在运行时)为Tworun

我的建议,使用@Override注释来确保在编译时方法被正确覆盖。

而且,你似乎与startrun方法被打:记得你需要extend Threadimplement Runnable为JVM认识到你的类作为Runnable秒。

+0

但为什么在私人情况'this.run()'给出输出One的方法而不是Two的运行,因为'This'在'Two'对象中不是'一个' – codegasmer

+2

@codegasmer http://stackoverflow.com/questions/5378995/confused-with-java-overriding-the-access-level –

0

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

1

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

Two你没有覆盖start()方法的类,因此t.start()使用One.start()这就要求One.run()其打印“一个”。

如果更改run()方法publicprotectedTwo类将覆盖它,并呼吁t.start()最终会调用Two声明的版本。

在 “流程图” 形式:
runprivate

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

runpublicprotected

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