缺陷:“覆盖”私有方法
2009-12-12 21:05
447 查看
今天看到think in java第8章多态,发现段很神奇的代码,有些疑问,标题也是取自书中的这节,主要是我不知道该叫什么。
代码
输出为private f()
也就是说是基类的方法被运行了。
我们都知道,在继承的时候,子类不会继承父类的private方法,那意味着,子类拥有的f方法是独立的。
在建立对象的过程中,我们知道,通过父类对象绑定的方法,其实是指向子类的,为什么对象执行f的时候,却依然执行父类的方法??
书上的结论是:只有非private方法才可以被覆盖;但是还需要密切注意覆盖private方法的现象,这时虽然编译器不会报错,但是也不会按照我们所期望的来执行。确切的说,在导出类中,对于基类中的private方法,最好采用不同的名字。
貌似完全没有讲到为什么会这么输出,只是提到了最好要避免这种情况。个人猜测,一旦子类重写了父类的方法(所谓重写,那父类一定不能是private的),动态绑定才能正确地将对象应用于子类本身,而是用private使得编译器无法得知具体绑定的是哪个方法,导致使用默认的顺序从基类输出。
代码
package privateoverride; public class PrivateOverride { private void f(){ System.out.println("private f()"); } public static void main(String[] args) { PrivateOverride po = new Derived(); po.f(); } } class Derived extends PrivateOverride { public void f(){ System.out.println("public f()"); } }
输出为private f()
也就是说是基类的方法被运行了。
我们都知道,在继承的时候,子类不会继承父类的private方法,那意味着,子类拥有的f方法是独立的。
在建立对象的过程中,我们知道,通过父类对象绑定的方法,其实是指向子类的,为什么对象执行f的时候,却依然执行父类的方法??
书上的结论是:只有非private方法才可以被覆盖;但是还需要密切注意覆盖private方法的现象,这时虽然编译器不会报错,但是也不会按照我们所期望的来执行。确切的说,在导出类中,对于基类中的private方法,最好采用不同的名字。
貌似完全没有讲到为什么会这么输出,只是提到了最好要避免这种情况。个人猜测,一旦子类重写了父类的方法(所谓重写,那父类一定不能是private的),动态绑定才能正确地将对象应用于子类本身,而是用private使得编译器无法得知具体绑定的是哪个方法,导致使用默认的顺序从基类输出。
相关文章推荐
- 多态的缺陷:“覆盖私有方法”
- 多态的缺陷:“覆盖私有方法”
- 缺陷:“覆盖”私有方法
- 多态的缺陷 “覆盖”私有方法
- 《java编程思想》之控制对成员的访问权限的原因、final、继承和组合、私有方法的“覆盖”
- 首页文章分类 关于 Search private(私有)方法单元测试无法覆盖?那就用反射调用来测试private(私有)方法
- Java关于子类对父类私有方法覆盖的问题
- think in java 第8章 多态 ------ 复盖私有方法的缺陷
- 关于继承中(静态方法+私有方法)的覆盖与重写问题
- Java 覆盖私有方法
- "覆盖"私有方法
- Java 反射调用类的属性和方法(包含父类私有属性和覆盖重写的方法等)
- Java 继承与初始化、“覆盖”私有方法
- private(私有)方法单元测试无法覆盖?那就用反射调用来测试private(私有)方法
- 缺陷:“重载”私有方法
- 包内私有方法无法覆盖,覆盖需宽化权限
- 多态的缺点(“覆盖”私有方法、域与静态方法)
- Java重载陷阱:“覆盖”私有方法
- 《java编程思想》之控制对成员的访问权限的原因、final、继承和组合、私有方法的“覆盖”
- 《java编程思想》之控制对成员的访问权限的原因、final、继承和组合、私有方法的“覆盖”