黑马程序员技术交流社区

标题: 多态分析 [打印本页]

作者: 李东梁    时间: 2014-3-24 22:55
标题: 多态分析
本帖最后由 李东梁 于 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用的不是父类中的成员吗?
复制代码


作者: 谭荣强    时间: 2014-3-24 23:42
运行结果:
D:\Java\day21>java Demo
B
C
7

作者: 李东梁    时间: 2014-3-24 23:47
谭荣强 发表于 2014-3-24 23:42
运行结果:
D:\Java\day21>java Demo
B

不对,结果就是5,我分析不出来结果怎么来的
作者: 月影释    时间: 2014-3-25 00:20
结果就是
B
C
7

如果说原因的话 你代码写错了   21行应该是 i=5  不是 i+=5
作者: 歌癫    时间: 2014-3-25 02:17
从你贴出的代码分析:
看主函数,它是程序的入口:
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
作者: 疯狂沙漠    时间: 2014-3-25 09:37
Super d=new Demo("A");用父类型的变量接收子类对象,子类拥有父类的成员,那么父类中的i,子类就可以使用,在实例化子类时,首先会自动调用父类的无参构造方法,将i初始化为2,同时也打印出B,然后再执行子类的构造方法,输出C,i=7,故结果为
B
C
7

作者: tcny    时间: 2014-3-25 10:04
兄弟你看我的代码改动的地方,毕老师的子类没有重新定义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. }
复制代码






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