黑马程序员技术交流社区

标题: 父子类中的同名变量问题 [打印本页]

作者: 游兴钟    时间: 2012-4-11 02:04
标题: 父子类中的同名变量问题
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在内存中式个怎样的演变过程呢?
作者: 未长法    时间: 2012-4-11 08:20
在主函数里面,首先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

作者: 孙国军    时间: 2012-4-11 09:11
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:32
本帖最后由 李彬彬 于 2012-4-11 09:34 编辑

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

未命名.JPG

作者: 黑马张平    时间: 2012-4-11 09:50
楼上有图,很详细。!
作者: 游兴钟    时间: 2012-4-12 10:42
嗯 谢谢  明白了
作者: wang耀雨    时间: 2012-4-12 11:47
achilles 发表于 2012-4-12 10:42
嗯 谢谢  明白了

你好,我有点不明白这个实例化过程,Super d=new Demo("A");为什么声明用父类super,定义用子类demo啊,麻烦解释下吧




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