黑马程序员技术交流社区

标题: 一题多态的题目,求内存执行分析 [打印本页]

作者: 沐子松/kf    时间: 2014-6-29 19:21
标题: 一题多态的题目,求内存执行分析
  1. package ls.test;

  2. class Fu {
  3.         int x = 4;
  4.        
  5.         Fu() {
  6.                 System.out.println("A fu() : " + getNum());
  7.         }

  8.         int getNum() {
  9.                 System.out.println("B fu getnum run...." + x);
  10.                 return 100;
  11.         }
  12. }

  13. class Zi extends Fu {
  14.         int x = 5;

  15.         Zi() {
  16.                 System.out.println("C zi() : "+getNum());
  17.         }

  18.         int getNum() {
  19.                 System.out.println("D zi getnum run...." + x);
  20.                 return 200;
  21.         }
  22. }

  23. class DuoTaiTest3 {
  24.         public static void main(String[] args)
  25.         {
  26.                 Zi f = new Zi();
  27.         }
  28. }
复制代码
执行结果:
D zi getnum run....0
A fu() : 200
D zi getnum run....5
C zi() : 200


为什么第一句打印的是“D zi getnum run....0”

作者: 18353666072    时间: 2014-6-29 19:49
那个0是因为还没初始化、。。。。。
作者: 沐子松/kf    时间: 2014-6-29 21:05
18353666072 发表于 2014-6-29 19:49
那个0是因为还没初始化、。。。。。

是为什么调用子类的getNum()
作者: yangcy    时间: 2014-6-29 22:04
public class Demo1 {

        public static void main(String[] args) {
                new Zi();
        }

}

class Fu {
        Fu() {
                this.show();
                System.out.println(this);
        }

        void show() {
                System.out.println("fu show() ...");
        }
}

class Zi extends Fu{
        int num = 5;

        Zi() {
                System.out.println("zi constructor() ..." + num);
        }

        void show() {
                System.out.println("zi show() ..." + num);
        }
}
作者: yangcy    时间: 2014-6-29 22:08
打印结果:
zi show() ...0
com.hy.day8.Zi@1fb8ee3
zi constructor() ...5

分析:其实子类构造方法里调用了父类的构造方法,那么父类的构造方法里调用show方法的时候相当于前面有个隐式的this指引,this表示调用这个方法的对象,现在是子类在调用父类的构造方法,因此 this.show();中的this表示的是子类的对象,于是问题就变成是子类的对象调用show方法,又因为子类中定义了show方法,所以根据多态,会覆盖父类的方法,所以最终调用的是子类自己的show方法。
作者: 哇塞哇    时间: 2014-6-30 09:13
还会有哪些地方会隐藏this,还有super

作者: 哇塞哇    时间: 2014-6-30 09:14
yangcy 发表于 2014-6-29 22:08
打印结果:
zi show() ...0
com.hy.day8.Zi@1fb8ee3

还有哪些主方会隐藏this ,super
作者: yangcy    时间: 2014-6-30 09:44
在子类的构造方法的第一行有一个隐式的super(),在一个类中的所有非静态方法中只要是直接调用方法的,都会有个隐式的this。
作者: 18353666072    时间: 2014-6-30 10:13
沐子松/kf 发表于 2014-6-29 21:05
是为什么调用子类的getNum()

子类重写了父类的方法之后就是用子类的,但是父类的方法还是在的,只是应用变了,指向了子类的那个方法,,
作者: 一只特立独行的猪    时间: 2014-6-30 13:28
本帖最后由 钱维莹 于 2014-6-30 13:34 编辑

这个好像跟多态没多大关系,如果改成Fu f = new Zi();才是多态,但运行结果一样。
按你写的来看,因为Zi类继承了Fu类,并覆盖了getNum()方法,f是Zi类的对象,自然就调用自己的getNum()方法了.
在实例化子类对象时,首先要执行父类的构造方法,因为父类构造方法中调用了getNum()方法,所以输出第一句是D zi getnum run....0

作者: 刘双    时间: 2014-6-30 16:19
顶下1111111111
作者: houyudong    时间: 2014-6-30 17:08
这哪里是多态啊???根本就是继承嘛,子类构造器会默认调用父类无参构造器,
作者: 沐子松/kf    时间: 2014-6-30 19:14
yangcy 发表于 2014-6-29 22:08
打印结果:
zi show() ...0
com.hy.day8.Zi@1fb8ee3

多谢               
作者: 沐子松/kf    时间: 2014-6-30 19:15
钱维莹 发表于 2014-6-30 13:28
这个好像跟多态没多大关系,如果改成Fu f = new Zi();才是多态,但运行结果一样。
按你写的来看,因为Zi类 ...

多谢,理解了           
作者: 尹兆国    时间: 2014-6-30 19:21
的范德萨范德萨
作者: luheqi    时间: 2014-6-30 19:28
有个隐藏的super();
作者: 尹兆国    时间: 2014-6-30 19:32
本帖最后由 尹兆国 于 2014-6-30 19:33 编辑
钱维莹 发表于 2014-6-30 13:28
这个好像跟多态没多大关系,如果改成Fu f = new Zi();才是多态,但运行结果一样。
按你写的来看,因为Zi类 ...

父类构造方法中的这个getNum是new Zi()调用的,而该对象不会调用父类中的getNum方法,它只会去调用子类中的getNum方法
作者: 沐子松/kf    时间: 2014-7-1 23:19
18353666072 发表于 2014-6-29 19:49
那个0是因为还没初始化、。。。。。

谢谢                 




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