黑马程序员技术交流社区

标题: 多态问题~ [打印本页]

作者: ZSMAN    时间: 2015-5-3 11:14
标题: 多态问题~
  1. class A ...{  
  2.          public String show(D obj)...{  
  3.                 return ("A and D");  
  4.          }   
  5.          public String show(A obj)...{  
  6.                 return ("A and A");  
  7.          }   
  8. }   
  9. class B extends A...{  
  10.          public String show(B obj)...{  
  11.                 return ("B and B");  
  12.          }  
  13.          public String show(A obj)...{  
  14.                 return ("B and A");  
  15.          }   
  16. }  
  17. class C extends B...{}   
  18. class D extends B...{}  
复制代码



main函数:
  1. A a1 = new A();  
  2.         A a2 = new B();  
  3.         B b = new B();  
  4.         C c = new C();   
  5.         D d = new D();   
  6.         System.out.println(a1.show(b));   ①  
  7.         System.out.println(a1.show(c));   ②  
  8.         System.out.println(a1.show(d));   ③  
  9.         System.out.println(a2.show(b));   ④  
  10.         System.out.println(a2.show(c));   ⑤  
复制代码
题目是网上搜的~对⑤的结果还有点困惑,感觉网上讲解的还是不够透彻~求指点~~



作者: 许庭洲    时间: 2015-5-3 15:06
本帖最后由 许庭洲 于 2015-5-3 15:10 编辑

1.方法的重写Overriding和重载Overloading是Java多态性的不同表现;
2.重写Overriding是父类与子类之间多态性的一种表现;
3.重载Overloading是一个类中多态性的一种表现;
4.如果在子类中定义某方法与其父类有相同的名称和参数,则该方法被重写 (Overriding);
5.如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。







作者: bboyXiaoNuo    时间: 2015-5-3 15:38
还没有学到啊,感觉好难。。。。。
作者: 江万锋    时间: 2015-5-3 16:01
没看懂..哇哈哈 我自己新区看多态的视频吧

作者: ZSMAN    时间: 2015-5-3 16:17
许庭洲 发表于 2015-5-3 15:06
1.方法的重写Overriding和重载Overloading是Java多态性的不同表现;
2.重写Overriding是父类与子类之间多态 ...

a2.show(b)中a2为B类型,b也是B类型。执行时应该按照B类的方法执行show(B object),结果却执行了show(A object)这个函数~为什么呢?
作者: 许庭洲    时间: 2015-5-3 16:31
ZSMAN 发表于 2015-5-3 16:17
a2.show(b)中a2为B类型,b也是B类型。执行时应该按照B类的方法执行show(B object),结果却执行了show(A o ...

先调用父类的show方法,再调用子类的show方法。
作者: ZSMAN    时间: 2015-5-3 16:42
许庭洲 发表于 2015-5-3 16:31
先调用父类的show方法,再调用子类的show方法。

它没有调用父类A的show(A obj)方法,而是调用了子类B的show(A obj)方法。这是为什么?
作者: ZSMAN    时间: 2015-5-3 16:45
许庭洲 发表于 2015-5-3 16:31
先调用父类的show方法,再调用子类的show方法。

a2.show(b)的结果是B and A
作者: 许庭洲    时间: 2015-5-3 16:58
ZSMAN 发表于 2015-5-3 16:45
a2.show(b)的结果是B and A

派生类如果定义了与继承而来的成员同名的新成员,就可以覆盖已继承的成员。
作者: ZSMAN    时间: 2015-5-3 17:06
许庭洲 发表于 2015-5-3 16:58
派生类如果定义了与继承而来的成员同名的新成员,就可以覆盖已继承的成员。 ...

a2.show(b)中还有一点不太清楚:B类中有show(A obj)和show(B obj)两个函数,为什么直接调用show(A obj)这个函数,不是有个show(B obj)吗?怎么不按照参数列表调用函数?难道是因为A是B的父类,就优先调用show(A obj)?
作者: ZSMAN    时间: 2015-5-3 17:09
许庭洲 发表于 2015-5-3 16:58
派生类如果定义了与继承而来的成员同名的新成员,就可以覆盖已继承的成员。 ...

自己弄明白了~show(B obj)没有在父类里定义过~a2是A类~看走眼了
作者: Mr.南郭    时间: 2015-5-3 17:23
System.out.println(a2.show(b));   调用的是show(A obj)方法,但是B类复写了A类的此方法,所以最终调用的是B类里复写后的方法,也就是输出B and A

System.out.println(a2.show(c));   此语句和一语句同理,只不过是传参为类C的对象,但是C继承了B,而B又继承了C,所以使用A类型的a2调用的也是B中复写后的show(A obj)方法,也就是输出B and A。

此题很有迷惑性,考察到了多态、重写、重载、继承等知识点。

作者: ZSMAN    时间: 2015-5-3 17:33
Mr.南郭 发表于 2015-5-3 17:23
System.out.println(a2.show(b));   调用的是show(A obj)方法,但是B类复写了A类的此方法,所以最终调用的 ...

当初看错了~将变量a2的类型看成是B类型了~实际上a2是A类型~a2.show(b)要看A中定义了哪些函数,执行要看B的~
作者: Mr.南郭    时间: 2015-5-3 21:04
ZSMAN 发表于 2015-5-3 17:33
当初看错了~将变量a2的类型看成是B类型了~实际上a2是A类型~a2.show(b)要看A中定义了哪些函数,执行要看B ...

嗯,这种题陷阱多
作者: jing3133920    时间: 2015-5-3 21:53
路过学习学习
作者: dianxiaoer    时间: 2015-5-3 22:18

路过学习学习 看看




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