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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 沙漠里的小鱼 黑马帝   /  2014-3-11 22:13  /  988 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package com.asp;
public class Test1 {
public static void main(String[] args) {
   Fu a = new Zi();
   a.b();
}
}
class Fu {
public void a() {
   System.out.println("fu---a");
}
public void b() {
   System.out.println("fu---b");
   a();
}
}
class Zi extends Fu {
public void a() {
   System.out.println("zi----a");
}
public void b() {
   System.out.println("zi----b");
super.b();
   System.out.println(super.toString());
}
}
   
运行的结果是
zi----b
fu---b
zi----a
com.asp.Zi@1fc4bec
我有个不明白的地方 红色的代码super.b()不是相当于调用父类对象的b方法吗  
父类对象里面b方法又调用了a方法  那不是应该也是调用的父类的a方法吗
所以我感觉运行结果应该是
zi----b
fu---b
fu---a
还有我最后打印的super.toString()也应该返回一个父类的实例啊  怎么返回了子类的实例了

评分

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

查看全部评分

8 个回复

倒序浏览
因你构建的是子类的实例对象的,只不过是拿父类的引用指向了子类的对象,
而你在子类中有重写了父类的a方法,所以调用的是子类的方法...
回复 使用道具 举报
我也想知道这个。  我在调试模式下运行了下,发现是调用的Zi的a方法
回复 使用道具 举报
父类中的一个方法只有在在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;
回复 使用道具 举报
榨菜 发表于 2014-3-11 22:55
父类中的一个方法只有在在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用; ...

恩  是的 那你知道我那个代码为什么吗  能解释下吗
回复 使用道具 举报
沙漠里的小鱼 发表于 2014-3-11 23:44
恩  是的 那你知道我那个代码为什么吗  能解释下吗

  我是从这篇文章里复制下来的,我也不知道原因,背下来就是了。   http://java.chinaitlab.com/base/816629.html
回复 使用道具 举报
榨菜 发表于 2014-3-11 23:51
我是从这篇文章里复制下来的,我也不知道原因,背下来就是了。   http://java.chinaitlab.com/base/816 ...

哎 没人指点一下啊
回复 使用道具 举报
因为你复写了子类的函数,非静态的成员函数中,应该返回的是子类方法
回复 使用道具 举报
张贺 中级黑马 2014-3-13 08:25:23
9#
  1. public class Tests1
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 Fu a = new Zi();
  6.                 a.b();
  7.                 [color=Red]Fu a1=new Fu();[/color]
  8.                 [color=Red]a1.b();[/color]
  9.         }
  10. }
  11. class Fu
  12. {
  13.         public void a()
  14.         {
  15.                 System.out.println("fu---a");
  16.         }
  17.         public void b()
  18.         {
  19.                 System.out.println("fu---b");                
  20.                 [color=Red]System.out.println(this.toString());[/color]
  21.                 a();
  22.         }
  23. }
  24. class Zi extends Fu
  25. {
  26.         public void a()
  27.         {
  28.                 System.out.println("zi----a");
  29.         }
  30.         public void b()
  31.         {
  32.                 System.out.println("zi----b");
  33.                 super.b();
  34.                 System.out.println(super.toString());
  35.         }
  36. }
复制代码

在类的内部,可以通过this关键字来调用它内部的实例成员,而this指的就是当前对象,通过上述打印输出,得出当前this实际上是子类的对象,所以在调用时调用的是子类中的方法。

评分

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

查看全部评分

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