黑马程序员技术交流社区

标题: 求解答 [打印本页]

作者: 唯伟123    时间: 2014-4-12 22:59
标题: 求解答
本帖最后由 唯伟123 于 2014-4-12 23:02 编辑
  1. //代码给上
复制代码
求解答
  1. class Super
  2. {
  3.         int i=0;
  4.         public Super(String a)
  5.         {
  6.                 System.out.println("A");
  7.                 i=1;        
  8.         }
  9.         public Super()
  10.         {
  11.                 System.out.println("B");
  12.                 i+=2;
  13.         }
  14. }

  15. class Demo extends Super
  16. {
  17.         public Demo(String a)
  18.         {
  19.                
  20.                 System.out.println("C");
  21.                 i=5;                                
  22.         }
  23.         public static void main(String[] args)
  24.         {
  25.                 int i=4;
  26.                 Super d=new Demo("A");
  27.                 System.out.println(d.i);
  28.         }
  29. }
复制代码
Super d = new Demo("A");是如何执行的?


作者: 赵小豪    时间: 2014-4-12 23:13
创建子类对象,先走父类,再走子类,子类覆盖父类方法。所以第一步创建子类对象运行public Demo(String a)   ;并没有输出,在输出之前调用父类的空构造函数 public Super(),也就是说子类没有声明调用父类带参的构造函数都默认调用父类的空构造函数,所以会打印输出父类中的B,然后在执行子类中的打印输出语句输出C,在给变量i进行赋值i=5,最后执行主函数main中的输出语句输出5.所以程序输出打印:BC5
作者: 老貓钓鱼    时间: 2014-4-12 23:19
public Demo(String a)
        {
               //这里有super()  会把父类的无参构造函数加载进来,自然先打印出来 B
              //同时i的值变为2
                System.out.println("C");
                i=5;  //这里其实是super.i = 5也就是把父类i的值赋值为5,因为多态的特性,成员变量看左边,她就是父类                          
        }

所以打印结果是 b  c  5
作者: 赵小豪    时间: 2014-4-12 23:19
请看此图,希望可以帮助你

1.jpg (105.43 KB, 下载次数: 10)

1.jpg

作者: 老貓钓鱼    时间: 2014-4-12 23:22
赵小豪 发表于 2014-4-12 23:19
请看此图,希望可以帮助你

这个5其实不是这样直接下来的,应该是把父类的i赋值为5(如果子类里面也有i的变量的话,结果就完全不是这样了)
作者: 赵小豪    时间: 2014-4-12 23:26
老貓钓鱼 发表于 2014-4-12 23:22
这个5其实不是这样直接下来的,应该是把父类的i赋值为5(如果子类里面也有i的变量的话,结果就完全不是这 ...

不是创建的是子类对象吗?子类继承父类,这个i是父类的,我知道啊。
作者: muma    时间: 2014-4-12 23:28
  1. class Super

  2. {

  3.         int i=0;

  4.         public Super(String a)

  5.         {

  6.                 System.out.println("A");

  7.                 i=1;        

  8.         }

  9.         public Super()

  10.         {

  11.                 System.out.println("B");

  12.                 i+=2;

  13.         }

  14. }


  15. class Demo extends Super

  16. {

  17.         public Demo(String a)

  18.         {

  19.                
  20.                 System.out.println("C");

  21.                 i=5;                                

  22.         }

  23.         public static void main(String[] args)

  24.         {

  25.                 int i=4;//住函数的 int i的值没有用到

  26.                 Super d=new Demo("A");//先执行父类Super中空参数的构造函数输出B,然后再执行子类Demo中含String类型的构造函数输出C。此时堆内存中建立了对象i的值为5;

  27.                 System.out.println(d.i);//输出子类对象的参数i为5。

  28.         }

  29. }
复制代码

作者: 赵小豪    时间: 2014-4-12 23:28
赵小豪 发表于 2014-4-12 23:26
不是创建的是子类对象吗?子类继承父类,这个i是父类的,我知道啊。

在这求教了,请详解
作者: 赵连明    时间: 2014-4-12 23:28
  第26行 int i=4; 这个无用可以去掉.
而且 第27行 Super d=new Demo("A");  "A"只有类型也就是 String 有影响
Demo默认调用空构造函数,先打印B,赋值i=2.然后就是打印B,赋值i=5
最后输出 d.i 就是5.
B
C
5

作者: luoyilan222    时间: 2014-4-13 09:02





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