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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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);
        }
}

11 个回复

倒序浏览
A  C  1 当你新建对象时,先调用子类的构造函数,然后执行父类的无参构造函数,所以先打印A,然后在打印C,多态的变量值在父类和子类中都不变,只看左边

点评

我把程序拿过去怎么打的是 AC5???  发表于 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。
回复 使用道具 举报 1 0
默认会先调用父类无参构造函数,A,i =1;
然后调用子类自己的含参构造寒素,C,i=5;
最后AC5
回复 使用道具 举报
fantacyleo 发表于 2014-7-28 22:16
A C 5
A和C的原因正如2楼所说。至于5,要注意的是:
1. 成员变量不存在多态,只存在隐藏——即子类定义了 ...

谢谢哈,你的解释很详细
回复 使用道具 举报
不过我在视频里看的就是要关于多态啊
回复 使用道具 举报
liuck 初级黑马 2014-7-28 22:43:40
7#
长知识了!!
回复 使用道具 举报
路过,研究下~
回复 使用道具 举报
ztw 中级黑马 2014-7-28 23:02:46
9#
我看明白了,我看错了,因为子类中没有重新定义i,所以值改变成5了
回复 使用道具 举报
liusj 中级黑马 2014-7-28 23:44:22
10#
给个赞,不仅要看视频,还要动动手啊
回复 使用道具 举报
vaqh 中级黑马 2014-7-28 23:45:46
11#
liusj 发表于 2014-7-28 23:44
给个赞,不仅要看视频,还要动动手啊

对,就是不要懒
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马