A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 651012160 中级黑马   /  2013-12-23 16:30  /  1343 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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. }
复制代码

4 个回复

倒序浏览
在你实例化子类对象时,子类的构造函数中隐藏了super(),也就自动调用了父类不带参数的构造方法,所以在你的程序里会输出father
回复 使用道具 举报
当你实例化子类的对象时,先执行父类的构造方法,在执行子类的构造方法.而father的构造方法里面,this关键字
是指的父类,而不是子类,所以执行的是父类里面的init(),所以输出的是father
回复 使用道具 举报
楼上有一点搞错了
父类构造器里面的this在这里不是指父类对象,而是指的子类对象。(具体原因可能是子类调用父类构造器,我也不清楚,网上也没有关于这一点的讨论)
之所以打印father()是因为init()方法时private 不被子类继承,如果你把private去掉 打印的就是son
回复 使用道具 举报
父类的私有方法不能被子类覆盖,子类方法覆盖父类的方法的前提是子类继承父类的特定方法,但是, Father类的init()方法的权限为private,是私有的,因此不能被子类继承,因此 Son 类中的init()和 Father类的init()并不存在覆盖关系,因此在初始化时Father()这个构造函数会调用父类中的这个权限为private的init()方法。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马