黑马程序员技术交流社区

标题: 一段小程序的执行结果问题 [打印本页]

作者: 黄小钒    时间: 2012-4-17 22:03
标题: 一段小程序的执行结果问题
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?  

*/
作者: 贠(yun)靖    时间: 2012-4-17 22:09
额  5分  还有这好事,我怎么遇不到呢 哈哈
作者: 黄小钒    时间: 2012-4-17 22:10
哇!  太好了!!!   惊天喜讯! 谢谢管理员! 谢谢各位朋友!  撒花~~~~~:lol
作者: liuyang    时间: 2012-4-17 22:28
本帖最后由 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的影响
作者: 蒙武辉    时间: 2012-4-17 22:42
int i=4在这里是迷惑你作用,并没有被调用。首先子类会调用父类的空参数构造函数,然后再调用自己的构造函数。

作者: 曾虓    时间: 2012-4-17 22:56
liuyang 发表于 2012-4-17 22:28
先执行了下面这个构造函数i从0变到2即i=0+2
public Super()
         {

楼主问的不是这个,
而是基类为什么执行的不是这个构造函数
        public Super(String a)
        {
                System.out.println("A");
                i=1;      
        }

作者: 黑马-刘昌文    时间: 2012-4-17 23:00
子类在继承父类时,子类在申明带参数的构造方法时必须显示的调用父类带参数的构造方法,否咋子类会先去调用父类无参的构造方法,再调用自己的构造方法!
刚开始时 i=0,当调用父类不带参数的构造方法时  i+=2; i=2 输出B,再调用自己带参数的构造方法时,  i+=5;      i=7 输出C,

作者: 李斌    时间: 2012-4-18 13:55
楼主 人品太好了。。{:soso_e163:}
作者: 韩新凯    时间: 2012-4-18 14:48
建议:以后尽量不要用关键字命名类。
在 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 。
作者: 韩新凯    时间: 2012-4-18 14:49
接下来,祝贺楼主好运。天天拼命挣技术分的孩子上不起啊
作者: 马东华    时间: 2012-4-18 15:55
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 22:27
马东华 发表于 2012-4-18 15:55
class Super
{
        int i=0;

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

已经想通了 ,谢谢这位同学 ~~~
作者: 黄小钒    时间: 2012-4-18 22:35
韩新凯 发表于 2012-4-18 14:49
接下来,祝贺楼主好运。天天拼命挣技术分的孩子上不起啊

呵呵  谢谢你  也祝你好运! :lol 加油
作者: 马东华    时间: 2012-4-19 00:49
黄小钒 发表于 2012-4-18 22:27
你回答的不对,此处的 int i = 4 是局部变量,而d.i 指的是成员变量,两者没有关系,谈不上覆盖。 ...

哦,对,没看清楚,不好意思了




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