【发布时间】:2014-12-18 20:43:00
【问题描述】:
我有这个测试代码示例:
公共类测试{ 私有静态类 Test3 { 私人无效打印1(){ System.out.println("1"); } } 私有静态类 Test4 扩展 Test3 { 私人无效打印1(){ System.out.println("2"); } } 公共静态无效主要(字符串[]参数){ System.out.println("重写调用私有方法----"); OuterTest.Test1 test1 = new OuterTest.Test1(); OuterTest.Test2 test2 = new OuterTest.Test2(); OuterTest.Test1 test12 = new OuterTest.Test2(); test1.invokeOverriden(); test2.invokeOverriden(); test12.invokeOverriden(); System.out.println("从父类调用私有方法----"); test1.invokeNotOverriden(); test2.invokeNotOverriden(); test12.invokeNotOverriden(); System.out.println("一些魔法----"); Test3 test3 = new Test3(); Test4 test4 = new Test4(); Test3 test34 = new Test4(); test3.print1(); test4.print1(); test34.print1(); } } 类外测试{ 公共静态类 Test1 { 公共无效调用覆盖(){ 打印1(); } 公共无效调用NotOverriden(){ 打印1(); } 私人无效打印1(){ System.out.println("1"); } } 公共静态类 Test2 扩展 Test1 { @覆盖 公共无效调用覆盖(){ 打印1(); } 私人无效打印1(){ System.out.println("2"); } } }首先,我认为一切正常:
重写对私有方法的调用---------------- 1 2 2然后,如果我调用未实现的父方法,继承类的私有方法就会消失。可以解释为“所有私有方法都是最终的并且对派生类隐藏”,所以invokeNotOverriden() 对 Test2 类中的方法一无所知:
最后,在静态类中,当我调用非静态私有方法时,突然出现了一些魔法:
一些魔法---------------- 1 2 1我期待1 2 2 在这里。为什么我错了?
【问题讨论】:
-
你不能重写私有方法——简单地说,就是这样。
-
我知道。而且我不会覆盖私有方法。我将类对象创建为
Base b = new Inherited(),并调用了它的私有方法。我认为,b现在是Inherited。为什么不是真的?
标签: java inheritance static overriding static-methods