黑马程序员技术交流社区

标题: 请教一个JAVA多态的问题 [打印本页]

作者: 沙漠里的小鱼    时间: 2014-3-11 22:13
标题: 请教一个JAVA多态的问题
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()也应该返回一个父类的实例啊  怎么返回了子类的实例了


作者: .......    时间: 2014-3-11 22:46
因你构建的是子类的实例对象的,只不过是拿父类的引用指向了子类的对象,
而你在子类中有重写了父类的a方法,所以调用的是子类的方法...
作者: 榨菜    时间: 2014-3-11 22:47
我也想知道这个。  我在调试模式下运行了下,发现是调用的Zi的a方法
作者: 榨菜    时间: 2014-3-11 22:55
父类中的一个方法只有在在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;
作者: 沙漠里的小鱼    时间: 2014-3-11 23:44
榨菜 发表于 2014-3-11 22:55
父类中的一个方法只有在在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用; ...

恩  是的 那你知道我那个代码为什么吗  能解释下吗
作者: 榨菜    时间: 2014-3-11 23:51
沙漠里的小鱼 发表于 2014-3-11 23:44
恩  是的 那你知道我那个代码为什么吗  能解释下吗

  我是从这篇文章里复制下来的,我也不知道原因,背下来就是了。   http://java.chinaitlab.com/base/816629.html
作者: 沙漠里的小鱼    时间: 2014-3-12 20:51
榨菜 发表于 2014-3-11 23:51
我是从这篇文章里复制下来的,我也不知道原因,背下来就是了。   http://java.chinaitlab.com/base/816 ...

哎 没人指点一下啊
作者: ς高眼光の目标    时间: 2014-3-13 04:02
因为你复写了子类的函数,非静态的成员函数中,应该返回的是子类方法
作者: 张贺    时间: 2014-3-13 08:25
  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实际上是子类的对象,所以在调用时调用的是子类中的方法。




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