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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄小钒 中级黑马   /  2012-4-17 22:03  /  3068 人查看  /  14 人回复  /   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);
        }
}


/* 程序执行结果为:
B
C
i =7   不明白这里 i 为什么等于7?  

*/

点评

我擦,发财了,恭喜恭喜  发表于 2012-4-17 22:05

评分

参与人数 2技术分 +5 黑马币 +10 收起 理由
李斌 + 10 赞一个!
admin + 5 你是幸运儿,你发的贴是黑马9期第1000个贴.

查看全部评分

14 个回复

倒序浏览
额  5分  还有这好事,我怎么遇不到呢 哈哈
回复 使用道具 举报
哇!  太好了!!!   惊天喜讯! 谢谢管理员! 谢谢各位朋友!  撒花~~~~~:lol
回复 使用道具 举报
本帖最后由 liuyang 于 2012-4-17 22:29 编辑

先执行了下面这个构造函数i从0变到2即i=0+2
public Super()
         {
                 System.out.println("B");
                 i+=2;
         }
然后执行了下面这个函数i从2变到7即i=2+5
public Demo(String a)
        {
                //super();
                System.out.println("C");
                i+=5;                                
        }

所以最后的结果是7,你不要受主函数里面的变量i的影响
回复 使用道具 举报
int i=4在这里是迷惑你作用,并没有被调用。首先子类会调用父类的空参数构造函数,然后再调用自己的构造函数。
回复 使用道具 举报
liuyang 发表于 2012-4-17 22:28
先执行了下面这个构造函数i从0变到2即i=0+2
public Super()
         {

楼主问的不是这个,
而是基类为什么执行的不是这个构造函数
        public Super(String a)
        {
                System.out.println("A");
                i=1;      
        }
回复 使用道具 举报
子类在继承父类时,子类在申明带参数的构造方法时必须显示的调用父类带参数的构造方法,否咋子类会先去调用父类无参的构造方法,再调用自己的构造方法!
刚开始时 i=0,当调用父类不带参数的构造方法时  i+=2; i=2 输出B,再调用自己带参数的构造方法时,  i+=5;      i=7 输出C,
回复 使用道具 举报
李斌 中级黑马 2012-4-18 13:55:22
8#
楼主 人品太好了。。{:soso_e163:}
回复 使用道具 举报
建议:以后尽量不要用关键字命名类。
在 Super d=new Demo("A");System.out.println("i="+d.i);里面的 i 不是你在主方法中定义的int i = 4,
而是继承来自Super类的 i ,通过Super d = new Demo(“A”);首先调用了Super的无参构造函数,运行后 i 的结果变 成了2,后来又调用了Demo的构造函数运行完之后 i 就变成了7.其中d是Super类的引用,d.i调用的依然是Super的 i 。
回复 使用道具 举报
接下来,祝贺楼主好运。天天拼命挣技术分的孩子上不起啊
回复 使用道具 举报
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");-------//虚拟机在加载类的内存是,会调用其相应的构造函数,而如果此类有父类的话,会先加载父类的空参构造函数(结构i=2)当加载本尊的构造
                                       //得出(i+=5;---i=7;)覆盖了原来内存中的i=4;所以打印结果是7。
                System.out.println(d.i);
        }
}


/* 程序执行结果为:
B
C
i =7   不明白这里 i 为什么等于7?  

回复 使用道具 举报
马东华 发表于 2012-4-18 15:55
class Super
{
        int i=0;

你回答的不对,此处的 int i = 4 是局部变量,而d.i 指的是成员变量,两者没有关系,谈不上覆盖。
回复 使用道具 举报
liuyang 发表于 2012-4-17 22:28
先执行了下面这个构造函数i从0变到2即i=0+2
public Super()
         {

已经想通了 ,谢谢这位同学 ~~~
回复 使用道具 举报
韩新凯 发表于 2012-4-18 14:49
接下来,祝贺楼主好运。天天拼命挣技术分的孩子上不起啊

呵呵  谢谢你  也祝你好运! :lol 加油
回复 使用道具 举报
黄小钒 发表于 2012-4-18 22:27
你回答的不对,此处的 int i = 4 是局部变量,而d.i 指的是成员变量,两者没有关系,谈不上覆盖。 ...

哦,对,没看清楚,不好意思了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马