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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© HM张健 中级黑马   /  2013-3-22 23:54  /  1743 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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吧


评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

5 个回复

倒序浏览
本帖最后由 王晓楠 于 2013-3-23 00:32 编辑

new SubDemo()先调用父类的构造方法,父类执行display(),这个display()是父类本身的,打印i,这时父类的i还没有进行显示初始化,所以打印的是默认的0.具体可看毕老师讲的。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
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();
    }
}

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
马利 来自手机 中级黑马 2013-3-23 00:43:34
板凳
王晓楠 发表于 2013-3-23 00:31
new SubDemo()先调用父类的构造方法,父类执行display(),这个display()是父类本身的,打印i,这时父类的i ...

这个display是父类的吗?你在父类的输出里面加点标志看看输出结果
回复 使用道具 举报
本帖最后由 谭辉 于 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

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
谭辉 发表于 2013-3-23 01:22
对象初始化过程:
1.        因为new用到了.class所以会先找到 .class文件并加载到内存中.
2.        执行 ...

哦  懂啦  因为子类方法重写父类方法 父类构造器调用了重写方法 同时子类的属性未进行显示初始化默认为0
OK:handshake
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马