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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 沐子松/kf 中级黑马   /  2014-6-29 19:21  /  1256 人查看  /  17 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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”

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

17 个回复

倒序浏览
那个0是因为还没初始化、。。。。。
回复 使用道具 举报
18353666072 发表于 2014-6-29 19:49
那个0是因为还没初始化、。。。。。

是为什么调用子类的getNum()
回复 使用道具 举报
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);
        }
}

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
打印结果:
zi show() ...0
com.hy.day8.Zi@1fb8ee3
zi constructor() ...5

分析:其实子类构造方法里调用了父类的构造方法,那么父类的构造方法里调用show方法的时候相当于前面有个隐式的this指引,this表示调用这个方法的对象,现在是子类在调用父类的构造方法,因此 this.show();中的this表示的是子类的对象,于是问题就变成是子类的对象调用show方法,又因为子类中定义了show方法,所以根据多态,会覆盖父类的方法,所以最终调用的是子类自己的show方法。
回复 使用道具 举报
还会有哪些地方会隐藏this,还有super
回复 使用道具 举报
yangcy 发表于 2014-6-29 22:08
打印结果:
zi show() ...0
com.hy.day8.Zi@1fb8ee3

还有哪些主方会隐藏this ,super
回复 使用道具 举报
yangcy 中级黑马 2014-6-30 09:44:23
8#
在子类的构造方法的第一行有一个隐式的super(),在一个类中的所有非静态方法中只要是直接调用方法的,都会有个隐式的this。
回复 使用道具 举报
沐子松/kf 发表于 2014-6-29 21:05
是为什么调用子类的getNum()

子类重写了父类的方法之后就是用子类的,但是父类的方法还是在的,只是应用变了,指向了子类的那个方法,,
回复 使用道具 举报
本帖最后由 钱维莹 于 2014-6-30 13:34 编辑

这个好像跟多态没多大关系,如果改成Fu f = new Zi();才是多态,但运行结果一样。
按你写的来看,因为Zi类继承了Fu类,并覆盖了getNum()方法,f是Zi类的对象,自然就调用自己的getNum()方法了.
在实例化子类对象时,首先要执行父类的构造方法,因为父类构造方法中调用了getNum()方法,所以输出第一句是D zi getnum run....0
回复 使用道具 举报
顶下1111111111
回复 使用道具 举报
这哪里是多态啊???根本就是继承嘛,子类构造器会默认调用父类无参构造器,
回复 使用道具 举报
yangcy 发表于 2014-6-29 22:08
打印结果:
zi show() ...0
com.hy.day8.Zi@1fb8ee3

多谢               
回复 使用道具 举报
钱维莹 发表于 2014-6-30 13:28
这个好像跟多态没多大关系,如果改成Fu f = new Zi();才是多态,但运行结果一样。
按你写的来看,因为Zi类 ...

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

父类构造方法中的这个getNum是new Zi()调用的,而该对象不会调用父类中的getNum方法,它只会去调用子类中的getNum方法
回复 使用道具 举报
18353666072 发表于 2014-6-29 19:49
那个0是因为还没初始化、。。。。。

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