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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李东梁 中级黑马   /  2014-3-24 22:55  /  1266 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李东梁 于 2014-3-25 11:40 编辑
  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. }
  30. 毕老师在讲解这题时结果是 B, C ,5
  31. 但是Super d=new Demo("A");
  32.                 System.out.println(d.i);
  33. Demo类型提升,d.i用的不是父类中的成员吗?
复制代码

评分

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

查看全部评分

6 个回复

倒序浏览
运行结果:
D:\Java\day21>java Demo
B
C
7
回复 使用道具 举报
谭荣强 发表于 2014-3-24 23:42
运行结果:
D:\Java\day21>java Demo
B

不对,结果就是5,我分析不出来结果怎么来的
回复 使用道具 举报
结果就是
B
C
7

如果说原因的话 你代码写错了   21行应该是 i=5  不是 i+=5
回复 使用道具 举报
从你贴出的代码分析:
看主函数,它是程序的入口:
1,int i=4;这句你定义一个整型变量i,并赋值为4;不多说
2,Super d=new Demo("A");这里你父类对象,new子类,是多态的表现形式,多态体系在子父类关系中;new Demo("A"),将Demo对象初始赋值为A,它将找到对应的构造函数,public Demo(String a),这里面有一个默认的父类构造函数super();这时候程序找到父类的构造函数public Super(),结果打印B,i=2,此时继续运行,则打印C,i+=5,这时i=7;结束。
3,System.out.println(d.i);这里打印i的值,上面分析i=7,故打印7
   最后输出的结果为:B C 7
   继承关系的出现,父类的内容不仅仅是父类的,其子类也全部继承下来了,故此时d.i虽然用的是父类中的成员,但值是7

评分

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

查看全部评分

回复 使用道具 举报
Super d=new Demo("A");用父类型的变量接收子类对象,子类拥有父类的成员,那么父类中的i,子类就可以使用,在实例化子类时,首先会自动调用父类的无参构造方法,将i初始化为2,同时也打印出B,然后再执行子类的构造方法,输出C,i=7,故结果为
B
C
7

评分

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

查看全部评分

回复 使用道具 举报
tcny 中级黑马 2014-3-25 10:04:48
7#
兄弟你看我的代码改动的地方,毕老师的子类没有重新定义int i ,所以子类把父类的 i 继承过去了。而我的代码重新定义了 i ,那么根据子类的成员变量不能覆盖父类的原则就是B C 2了。这个题我问过了,你不会是为了技术分在这瞎问问题吧?
public class Super {
        int i = 0;
        public Super(String a){
                System.out.println("A");
                i = 1;
        }
        public Super(){
                System.out.println("B");
                i += 2;
        }
}
  1. class Test extends Super{
  2.         int i;//注意这里
  3.         public Test(String a){
  4.                 System.out.println("C");
  5.                 i = 5;
  6.         }
  7.         public static void main(String[] args) {
  8.                 int i = 4;
  9.                 Super t = new Test("A");
  10.                 System.out.println(t.i);
  11.         }

  12. }
复制代码

评分

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

查看全部评分

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