黑马程序员技术交流社区

标题: 为什么输出的是father??? [打印本页]

作者: 651012160    时间: 2013-12-23 16:30
标题: 为什么输出的是father???
本帖最后由 651012160 于 2013-12-24 20:07 编辑
  1. class Father{
  2.     Father(){
  3.         this.init();
  4.     }
  5.     private void init(){
  6.          System.out.println("father");
  7.     }
  8. }
  9. class Son extends Father{
  10.    
  11.     void init(){
  12.          System.out.println("son");
  13.     }
  14. }
  15. class Aaa {
  16.      public static void main(String[] args){
  17.           Son a = new Son();
  18.           System.out.println("Hello World!");
  19.       }
  20. }
复制代码


作者: 李然    时间: 2013-12-23 17:04
在你实例化子类对象时,子类的构造函数中隐藏了super(),也就自动调用了父类不带参数的构造方法,所以在你的程序里会输出father
作者: 不愿一人    时间: 2013-12-23 17:58
当你实例化子类的对象时,先执行父类的构造方法,在执行子类的构造方法.而father的构造方法里面,this关键字
是指的父类,而不是子类,所以执行的是父类里面的init(),所以输出的是father
作者: 四五六七八    时间: 2013-12-23 18:13
楼上有一点搞错了
父类构造器里面的this在这里不是指父类对象,而是指的子类对象。(具体原因可能是子类调用父类构造器,我也不清楚,网上也没有关于这一点的讨论)
之所以打印father()是因为init()方法时private 不被子类继承,如果你把private去掉 打印的就是son
作者: 天天学习    时间: 2013-12-23 18:29
父类的私有方法不能被子类覆盖,子类方法覆盖父类的方法的前提是子类继承父类的特定方法,但是, Father类的init()方法的权限为private,是私有的,因此不能被子类继承,因此 Son 类中的init()和 Father类的init()并不存在覆盖关系,因此在初始化时Father()这个构造函数会调用父类中的这个权限为private的init()方法。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2