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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 马富林 于 2013-11-17 21:14 编辑

代码如下,运行结果是3,希望知道的同学帮忙分析下中间的详细过程。程序都走了哪几步?
  1. class Super
  2. {
  3.         int i=0;
  4.         public Super(int a)
  5.         {
  6.         
  7.         i=1;
  8.         }
  9.         public Super()
  10.         {
  11.         i+=2;
  12.         }
  13. }
  14. class Demo extends Super
  15. {
  16.         public Demo(int a)
  17.         {
  18.         i++;
  19.         }
  20.         public static void main(String[] args)
  21.         {
  22.         int i=4;
  23.         Super d=new Demo(5);
  24.         System.out.println(d.i);
  25.         
  26.         }
  27. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
FFF + 1

查看全部评分

6 个回复

正序浏览
  1. package com.itheima;


  2. class Super
  3. {
  4.         int i=0;
  5.         public Super(int a)
  6.         {        
  7.         i=1;
  8.         }
  9.         public Super()
  10.         {
  11.         i+=2;
  12.         }
  13. }
  14. class Demo extends Super
  15. {
  16.         public Demo(int a)
  17.         {
  18.         i++;
  19.         }
  20.         public static void main(String[] args)
  21.         {
  22.         int i=4;//这里的i=4是局部变量,不用管
  23.         Super d=new Demo(5);
  24.         //1.这一句中Super父类创建对象,没有指定构造函数,默认为空参数,执行Super(),则Super.i=2;
  25.         //2.父类函数执行完毕,开始执行子类函数Demo(5),开始i++,i为父类的变量,则super.i=3
  26.         //3.父类的对象d调用i,i为父类的变量,即d.i=3,输出完毕
  27.         System.out.println(d.i);
  28.         
  29.         }
  30. }
复制代码
回复 使用道具 举报
执行顺序:new Demo(),在调用Demo(5)的构造前 ,先掉用Super()构造。然后看System.out.println(d.i);
i=0; 接着无参构造,i+=2; 这时i=2,然后掉子类Demo(2),i++;最后输出i=3。
回复 使用道具 举报
第一步:int i=4;这里的i是重新定义的i,是个局部变量,跟成员变量没有关系。
第二步: new Demo(5);
第三步:i+=2;此时super.i=2。因为子类使用构造方法创建对象,需要使用父类的构造方法,如果没有指定,那么就默认为空参数的构造方法,而且父类的构造方法需要放在子类构造方法的第一行。此时super.i=2
第四步:i++;此时super.i=3。执行完父类的空参数构造函数,开始执行子类的构造函数,i++。由于子类当中没有自己定义的i,所以使用的是父类对象的i,即对super.i再加1.
第五步:把new Demo(5)这个对象的地址赋给d;
第六步:打印d.i;如上所述,子类使用的是父类的i,打印的是父类对象的i,即3.

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 赞一个!

查看全部评分

回复 使用道具 举报
本题涉及到多态问题,首先把多态的知识搞懂,我下面总结了一下,可以理解一下。
1、使用父类类型的引用指向子类的对象
2、该引用只能调用父类中定义的方法和变量
3、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法(动态连接)
4、变量不能被重写(覆盖),“重写”的概念只针对方法,如果子子类中”重写“了父类中的变量,那么在编译时会报错。
该题是调用变量,故该引用d只能调用父类中的方法和变量,你就不用你用管子类中的变量和方法了,这样就不会晕了。父类的变量方法开始运行,super方法中变量i变为1,到了下一个方法i的值就变为3,之后就输出。就这样。

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 希望可以写得更明白直观一些

查看全部评分

回复 使用道具 举报
i=4;   这个一直都存在,并且没有被改变过。

Super d=new Demo(5); 这句话先调用class Super{int i=0;public Super(){i+=2;}}   这会d.i==2;
然后调用Demo 类中的构造函数Demo(int a){i++;}  这里的i是对象调用的,所以i++  d.i==3;
你最后打印d.i就是3;
如果你打印i结果就是4;
回复 使用道具 举报
执行顺序:
super(); i+=2 ==0+2==2;
Demo(5); i++ ==2+1==3
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马