黑马程序员技术交流社区

标题: 关于多态一个问题 [打印本页]

作者: 王涵    时间: 2013-9-30 11:01
标题: 关于多态一个问题
本帖最后由 杨增坤 于 2013-10-1 21:28 编辑


  1. class Father {
  2.         public void say() {
  3.                 System.out.println("I am father!");
  4.         }

  5. }

  6. class Son extends Father {
  7.         @Override
  8.         public void say() {
  9.                 System.out.println("I am son");
  10.         }
  11. }

  12. public class Test {

  13.         public void say(Father father) {
  14.                 System.out.println("say1");
  15.                 father.say();
  16.         }

  17.         public void say(Son son) {
  18.                 System.out.println("say2");
  19.                 son.say();
  20.         }

  21.         public static void main(String[] args) {
  22.                 Father father = new Son();
  23.                 new Test().say(father);
  24.         }
  25. }
复制代码
为什么结果是
say1
I am son
而不是
say2
I am son

作者: hyz123456    时间: 2013-9-30 11:36
Father father = new son();   因为JAVA是强类型语言(Strong type),语句中son对象被系统默认向上提升为Father类型,此时father是一个Father类类型对象,所以执行  new Test().say(father);  语句时实际上是往方法里面传一个Father类对象,执行结果say1;而由于say()方法是在建立对象的时候就封装在对象里的,所以father.say();的执行结果还是I am son!
你可以参考下byte i = i+1;
作者: 摄影勾魂    时间: 2013-9-30 12:31
本帖最后由 摄影勾魂 于 2013-9-30 12:35 编辑

在new Test().say(father)中,实参father是Father类型的对象,所以它调用的是:
  1. public void say(Father father) {
  2.                 System.out.println("say1");
  3.                 father.say();
  4.         }
复制代码
这个方法,那么打印出“say1”也就不难理解了;而这句Father father = new Son()应用了多态,编译类型是Father,运行类型是Son,那么在执行到System.out.println("say1")的下一句:  father.say()时,它实际上调用的是 class Son中的say()方法(该方法重写了 class Father中的say()方法),也就打印出了“I am son”。
作者: 血剑无痕    时间: 2013-9-30 13:11
Father father =new Son();这句是子类引用指向父类对象在内存中Father只是执行Son中的一小块区域.son继承了父类覆盖类的方法所以结果是Say1 I am son 希望对你有帮助。
作者: 黄炳期    时间: 2013-9-30 20:15
如果问题已经结束,请及时修改主题至“提问结束”




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