zoukankan      html  css  js  c++  java
  • 缺陷:“覆盖”私有方法

    今天看到think in java第8章多态,发现段很神奇的代码,有些疑问,标题也是取自书中的这节,主要是我不知道该叫什么。

    代码
    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使得编译器无法得知具体绑定的是哪个方法,导致使用默认的顺序从基类输出。

  • 相关阅读:
    1.Python进阶 词典dict
    10.Python基础 反过头来看看
    test
    地图添加标记物 并添加点击弹出框
    百度地图里面添加覆盖物的事件显示最后一个?
    css3之animation制作闪烁文字效果 转
    ajax beforeSend中无效果
    jquery 中 $('div','li')是什么意思?
    SQL 单引号转义
    jQuery 遍历
  • 原文地址:https://www.cnblogs.com/xiziyin/p/1622690.html
Copyright © 2011-2022 走看看