黑马程序员技术交流社区

标题: 继承的的一个小问题 [打印本页]

作者: HM张健    时间: 2013-3-22 23:54
标题: 继承的的一个小问题
本帖最后由 HM张健 于 2013-3-23 09:51 编辑
  1. class Base {
  2.     private int i = 2;
  3.    
  4.     public Base() {
  5.         this.display();
  6.     }
  7.    
  8.     public void display() {
  9.         System.out.println(i);
  10.     }
  11. }

  12. class SubDemo extends Base {
  13.     private int i = 22;
  14.    
  15.     public SubDemo() {
  16.         i = 222;
  17.     }
  18.    
  19.     public void display() {
  20.         System.out.println(i);
  21.     }   
  22. }

  23. public class TestSuperDemo {
  24.     public static void main(String[] args) {
  25.         new SubDemo();
  26.     }
  27. }
复制代码
这个结果么是0诶  我感觉应该是2吧



作者: 王晓楠    时间: 2013-3-23 00:31
本帖最后由 王晓楠 于 2013-3-23 00:32 编辑

new SubDemo()先调用父类的构造方法,父类执行display(),这个display()是父类本身的,打印i,这时父类的i还没有进行显示初始化,所以打印的是默认的0.具体可看毕老师讲的。
作者: 全超    时间: 2013-3-23 00:39
class Base {
    private int i = 2;//本类中的i私有的对子类无效
   
    public Base() { //new SubDemo对象时初始化方法先是找的Base的构造函数
       
        this.display();
    }
   
    public void display() {
        System.out.println(0);
    }
}

class SubDemo extends Base {
    private int i = 22;
   
    public SubDemo() {  
       //因为继承关系这里应该是隐式父类的构造函数Base()
           //这里就先执行下面的方法再执行赋值语句i=222;i默认为0
          i = 222;
        }
   
    public void display() {
        System.out.println(i);//并且这里的i是局部变量未赋值,只在这个方法中有效跟上面i无关。
    }   
}

public class TestSuperDemo {
    public static void main(String[] args) {
        new SubDemo();
    }
}
作者: 马利    时间: 2013-3-23 00:43
王晓楠 发表于 2013-3-23 00:31
new SubDemo()先调用父类的构造方法,父类执行display(),这个display()是父类本身的,打印i,这时父类的i ...

这个display是父类的吗?你在父类的输出里面加点标志看看输出结果
作者: 谭辉    时间: 2013-3-23 01:22
本帖最后由 谭辉 于 2013-3-23 09:14 编辑

对象初始化过程:
1.        因为new用到了.class所以会先找到 .class文件并加载到内存中.
2.        执行该类中的static代码块,给.class类进行初始化
3.        在堆内存中开辟空间,分配内存地址
4.        在堆内存中建立对象的特有属性.并进行默认初始化.
5.        对属性进行显示初始化
6.        对对象进行构造代码块初始化
7.        对对象进行对应的构造函数初始化
8.        将内存的地址赋给栈内存中的p变量

new SubDemo();过程:
先是调用父类的构造函数,此时父类的成员变量i已经显示初始化为2
进入父类的构造函数体内后调用子类的display()方法打印子类的成员变量i
而此时,子类的成员变量只是进行了默认初始化而还未进行显示初始化所以为0

作者: HM张健    时间: 2013-3-23 09:51
谭辉 发表于 2013-3-23 01:22
对象初始化过程:
1.        因为new用到了.class所以会先找到 .class文件并加载到内存中.
2.        执行 ...

哦  懂啦  因为子类方法重写父类方法 父类构造器调用了重写方法 同时子类的属性未进行显示初始化默认为0
OK:handshake




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