Java 多态笔记详解
2016-07-21 12:13
417 查看
记得大学中也经常提到多态,不过当时并不觉得有什么稀奇,也没多少好奇心。今天无意看了一篇关于Java
多态的文章,发现给了例子之后,有很多我们初学者觉得疑惑的地方(结果出乎我们意料),博主并没有很多的解释,所以决定续写下来吧。子:http://www.cnblogs.com/jack204/archive/2012/10/29/2745150.html
(一,相关类)
class A {
public String show(D obj){
return ("A and D");
}
public String show(A obj){
return ("A and A");
}
}
class B extends A{
public String show(B obj){
return ("B and B");
}
public String show(A obj){
return ("B and A");
}
}
class C extends B{}
class D extends B{}
(二,问以下输出会是什么?)
(三,答案是)
多态的文章,发现给了例子之后,有很多我们初学者觉得疑惑的地方(结果出乎我们意料),博主并没有很多的解释,所以决定续写下来吧。子:http://www.cnblogs.com/jack204/archive/2012/10/29/2745150.html
(一,相关类)
class A {
public String show(D obj){
return ("A and D");
}
public String show(A obj){
return ("A and A");
}
}
class B extends A{
public String show(B obj){
return ("B and B");
}
public String show(A obj){
return ("B and A");
}
}
class C extends B{}
class D extends B{}
(二,问以下输出会是什么?)
A a1 = new A(); A a2 = new B(); B b = new B(); C c = new C(); D d = new D(); System.out.println(a1.show(b)); ① System.out.println(a1.show(c)); ② System.out.println(a1.show(d)); ③ System.out.println(a2.show(b)); ④ System.out.println(a2.show(c)); ⑤ System.out.println(a2.show(d)); ⑥ System.out.println(b.show(b)); ⑦ System.out.println(b.show(c)); ⑧ System.out.println(b.show(d)); ⑨
(三,答案是)
① A and A ② A and A ③ A and D ④ B and A ⑤ B and A ⑥ A and D ⑦ B and B ⑧ B and B ⑨ A and D
--------------------------------------
对于引用 a1 中打印出的结果,并不足为奇,但 a2 打印的结果(4,5,6)往往令很多人感到迷惑(一开始我也是),原因是在这种情况下我们很容易理解为Class B 中的 的 public String show(B obj) 覆盖类 A中的方法,其实只是重载了一下show()方法而已。而且 a1 所持的对象,对 public String show(B obj) 这个方法是不可见的,因为 a1 句柄是Class A , 而A中并没有此方法(所以 4 中调用的方法是 public String show(A obj),而不是public String show(B obj))。结果6 也是同理,另外对于第6,为什么会调用public String show(D obj) 而不是调用 public String show(A obj) 呢?下面会给出。
其实出现这样的混淆的原因,主要是因为:
1. 我们容易混淆 这两个类中,到底哪个是重载,哪个是覆盖: 其实覆盖的条件是:(1)方法名相同,(2)定义的参数相同,不仅个数相同,而且类型也需要完全相同。
2. 在对象 b 中, 因为句柄是 Class B , 所以B 中的方法对于 b 是完全可见的, 但 我们传入 了 C 的对象和 D 的对象,那么这种情况下, 对象 c,d 在Class B 中的两个 b.show() 中,到底算 Class A 的类型 还是 Class B 的类型呢? 在这里,我的理解是从具体类型开始查找,然后一步一步逐步到父类,最后到 Object类(Object是所有Java Class 的父类)。
相关文章推荐
- java中Map集合的常用遍历方法及HashMap的应用实例
- SpringMVC学习笔记
- Java
- Spring整合MyBatis(二)源码分析
- Java之详解坦克大战游戏(二)
- 关于Java中String类型的参数传递问题
- Java之嵌套接口详解(附源码)
- Java 输出1-100内的质数
- SpringMVC 实现国际化与图片验证码
- Java 生成器 freemarker+rapid-generator 配置
- Heritrix 在 Eclipse 中的配置
- ant批量打包混淆修改资源文件
- myeclipse中java项目转web项目
- Java中HashMap遍历的两种方式
- 使用Spring框架的12个开源项目
- 浅谈Java并发编程
- Java数据类型转换
- Spring mvc+Spring+Mybatis整合
- Java反射及其应用
- Java JVM:内存溢出(栈溢出,堆溢出,持久代溢出以及 nable 3ff8 to create nati