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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 唯伟123 中级黑马   /  2014-4-12 22:59  /  1034 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 唯伟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");是如何执行的?

9 个回复

倒序浏览
创建子类对象,先走父类,再走子类,子类覆盖父类方法。所以第一步创建子类对象运行public Demo(String a)   ;并没有输出,在输出之前调用父类的空构造函数 public Super(),也就是说子类没有声明调用父类带参的构造函数都默认调用父类的空构造函数,所以会打印输出父类中的B,然后在执行子类中的打印输出语句输出C,在给变量i进行赋值i=5,最后执行主函数main中的输出语句输出5.所以程序输出打印:BC5

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
public Demo(String a)
        {
               //这里有super()  会把父类的无参构造函数加载进来,自然先打印出来 B
              //同时i的值变为2
                System.out.println("C");
                i=5;  //这里其实是super.i = 5也就是把父类i的值赋值为5,因为多态的特性,成员变量看左边,她就是父类                          
        }

所以打印结果是 b  c  5

评分

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

查看全部评分

回复 使用道具 举报
请看此图,希望可以帮助你

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

1.jpg

评分

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

查看全部评分

回复 使用道具 举报
赵小豪 发表于 2014-4-12 23:19
请看此图,希望可以帮助你

这个5其实不是这样直接下来的,应该是把父类的i赋值为5(如果子类里面也有i的变量的话,结果就完全不是这样了)
回复 使用道具 举报
老貓钓鱼 发表于 2014-4-12 23:22
这个5其实不是这样直接下来的,应该是把父类的i赋值为5(如果子类里面也有i的变量的话,结果就完全不是这 ...

不是创建的是子类对象吗?子类继承父类,这个i是父类的,我知道啊。
回复 使用道具 举报
muma 中级黑马 2014-4-12 23:28:14
7#
  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. }
复制代码

评分

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

查看全部评分

回复 使用道具 举报
赵小豪 发表于 2014-4-12 23:26
不是创建的是子类对象吗?子类继承父类,这个i是父类的,我知道啊。

在这求教了,请详解
回复 使用道具 举报
  第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

评分

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

查看全部评分

回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马