黑马程序员技术交流社区

标题: 好复杂,下面代码的输出结果是什么,为什么呢,求解释 [打印本页]

作者: vaqh    时间: 2014-7-28 21:49
标题: 好复杂,下面代码的输出结果是什么,为什么呢,求解释
class Super {
         int i=0;
        public Super()
        {
                System.out.println("A");
                i=1;
        }
        public Super(char a)
        {
                System.out.println("B");
                i+=2;
        }
}
class Demo extends Super
{
        public Demo(String a)
        {
                System.out.println("C");
                i=5;
        }
        public static void main(String[] args) {
                int i=4;
                Super s = new Demo("a");
                System.out.println(s.i);
        }
}


作者: ztw    时间: 2014-7-28 22:02
A  C  1 当你新建对象时,先调用子类的构造函数,然后执行父类的无参构造函数,所以先打印A,然后在打印C,多态的变量值在父类和子类中都不变,只看左边
作者: fantacyleo    时间: 2014-7-28 22:16
本帖最后由 fantacyleo 于 2014-7-28 22:17 编辑

A C 5
A和C的原因正如2楼所说。至于5,要注意的是:
1. 成员变量不存在多态,只存在隐藏——即子类定义了和父类同名的成员变量,此时到底访问谁的成员变量,只看引用变量的类型
2. 但是,本题中子类没有另外声明i,因此子类构造方法中的i就是继承自父类的i,子类构造函数赋值i=5,也就是改变了从父类继承下来的i的值,因此s.i的值是5。
作者: star5603    时间: 2014-7-28 22:16
默认会先调用父类无参构造函数,A,i =1;
然后调用子类自己的含参构造寒素,C,i=5;
最后AC5
作者: vaqh    时间: 2014-7-28 22:32
fantacyleo 发表于 2014-7-28 22:16
A C 5
A和C的原因正如2楼所说。至于5,要注意的是:
1. 成员变量不存在多态,只存在隐藏——即子类定义了 ...

谢谢哈,你的解释很详细
作者: ztw    时间: 2014-7-28 22:41
不过我在视频里看的就是要关于多态啊
作者: liuck    时间: 2014-7-28 22:43
长知识了!!
作者: 于龙超123    时间: 2014-7-28 22:55
路过,研究下~
作者: ztw    时间: 2014-7-28 23:02
我看明白了,我看错了,因为子类中没有重新定义i,所以值改变成5了
作者: liusj    时间: 2014-7-28 23:44
给个赞,不仅要看视频,还要动动手啊
作者: vaqh    时间: 2014-7-28 23:45
liusj 发表于 2014-7-28 23:44
给个赞,不仅要看视频,还要动动手啊

对,就是不要懒




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