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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ZSMAN 中级黑马   /  2015-5-3 11:14  /  657 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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));   ⑤  
复制代码
题目是网上搜的~对⑤的结果还有点困惑,感觉网上讲解的还是不够透彻~求指点~~


15 个回复

倒序浏览
本帖最后由 许庭洲 于 2015-5-3 15:10 编辑

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






回复 使用道具 举报
还没有学到啊,感觉好难。。。。。
回复 使用道具 举报
没看懂..哇哈哈 我自己新区看多态的视频吧
回复 使用道具 举报
许庭洲 发表于 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)这个函数~为什么呢?
回复 使用道具 举报
ZSMAN 发表于 2015-5-3 16:17
a2.show(b)中a2为B类型,b也是B类型。执行时应该按照B类的方法执行show(B object),结果却执行了show(A o ...

先调用父类的show方法,再调用子类的show方法。
回复 使用道具 举报
许庭洲 发表于 2015-5-3 16:31
先调用父类的show方法,再调用子类的show方法。

它没有调用父类A的show(A obj)方法,而是调用了子类B的show(A obj)方法。这是为什么?
回复 使用道具 举报
许庭洲 发表于 2015-5-3 16:31
先调用父类的show方法,再调用子类的show方法。

a2.show(b)的结果是B and A
回复 使用道具 举报
ZSMAN 发表于 2015-5-3 16:45
a2.show(b)的结果是B and A

派生类如果定义了与继承而来的成员同名的新成员,就可以覆盖已继承的成员。
回复 使用道具 举报
许庭洲 发表于 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)?
回复 使用道具 举报
许庭洲 发表于 2015-5-3 16:58
派生类如果定义了与继承而来的成员同名的新成员,就可以覆盖已继承的成员。 ...

自己弄明白了~show(B obj)没有在父类里定义过~a2是A类~看走眼了
回复 使用道具 举报
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。

此题很有迷惑性,考察到了多态、重写、重载、继承等知识点。
回复 使用道具 举报
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的~
回复 使用道具 举报
ZSMAN 发表于 2015-5-3 17:33
当初看错了~将变量a2的类型看成是B类型了~实际上a2是A类型~a2.show(b)要看A中定义了哪些函数,执行要看B ...

嗯,这种题陷阱多
回复 使用道具 举报
路过学习学习
回复 使用道具 举报

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