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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 游兴钟 中级黑马   /  2012-4-11 02:04  /  2245 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Super
{
        int i=0;
        public Super(String a)
        {
                System.out.println("A");
                i=1;       
        }
        public Super()
        {
                System.out.println("B");
                i+=2;
        }
}
class Demo extends Super
{
        public Demo(String a)
        {
                //super();
                System.out.println("C");
                i=5;                               
        }
        public static void main(String[] args)
        {
                int i=4;
                Super d=new Demo("A");
                System.out.println(d.i);
        }
}

这个d.i为什么没有指向父类中的i ?
在整个过程中i在内存中式个怎样的演变过程呢?

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

6 个回复

倒序浏览
在主函数里面,首先Super d=new Demo("A"); 调用子类的构造函数 Demo(String a ) 在调用子类的这个够好函数的时候在首行默认的有super()调用父类的空构造函数,所以先打印B  i 的默认值是0 执行完i =i+2 后i=2,然后打印C  这时i=5覆盖了前面的i=2 ,此时i=5.
Super d=new Demo("A")子类对象被父类引用:子类对象在向上转型.编译时看左边,运行时看右边,所以d.i 输出的是子类的i   也l就是i=5.
因此输出结果是:
B
C
5

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
1.因为子类构造函数的第一行如果没有使用this或者super指定引用的构造函数,就会在第一行默认添加super(),调用父类中的空参数构造函数,
public Super()
        {
                System.out.println("B");
                i+=2;
        }
输出B     i=2,
2.   System.out.println("C");
      i=5;      
打印C   i从新赋值为5

3.    System.out.println(d.i);
      d是父类引用类型指向子类对象
    d.i调用的是子类对象中的属性,此时子类中i=5;
      输出5;

最后打印的结果是B C 5
              
回复 使用道具 举报
本帖最后由 李彬彬 于 2012-4-11 09:34 编辑

未命名.JPG (52.55 KB, 下载次数: 170)

未命名.JPG
回复 使用道具 举报
楼上有图,很详细。!
回复 使用道具 举报
嗯 谢谢  明白了
回复 使用道具 举报
achilles 发表于 2012-4-12 10:42
嗯 谢谢  明白了

你好,我有点不明白这个实例化过程,Super d=new Demo("A");为什么声明用父类super,定义用子类demo啊,麻烦解释下吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马