Java入门学习(2)多态的理解
2015-12-21 17:05
591 查看
Java入门学习(2)多态的理解
面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。
多态存在的三个必要条件
**一、要有继承;
二、要有重写;
三、父类引用指向子类对象。**
如下输出结果?
这是对于多态的深入理解,解释如下:
1.实例对象为A,参数为对象B,B为A的子类。执行A.class中show(A obj)
2.同上
3.实例对象为A,参数为对象D,执行A.class中show(D obj)
4.实例对象依然为A,参数为B,本应执行A.class中show(A obj),但是,B.class重写了show(A obj),所以执行B.class show(A obj)
5.同上
6.执行A.class show(D obj) B中并没有重写。
7,8.实例对象为B,参数为B或者B的子类,执行show(B obj)
9.实例对象为B,参数为D,因为B继承自A,也可以执行A中的show(D obj)
其中:
A a2 = new B();
栈中的引用变量是A,堆中的实例变量是B。
将子类的实例,赋值给父类的引用。就是向上转型。
向上转型,在运行时,会遗忘子类对象中与父类对象中不同的方法。也会覆盖与父类中相同的方法–重写。(方法名,参数都相同)
所以a2,可以调用的方法就是,A中有的,但是B中没有的方法,和B中的重写A的方法。
理解了吧,少年!
面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。
多态存在的三个必要条件
**一、要有继承;
二、要有重写;
三、父类引用指向子类对象。**
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
这是对于多态的深入理解,解释如下:
1.实例对象为A,参数为对象B,B为A的子类。执行A.class中show(A obj)
2.同上
3.实例对象为A,参数为对象D,执行A.class中show(D obj)
4.实例对象依然为A,参数为B,本应执行A.class中show(A obj),但是,B.class重写了show(A obj),所以执行B.class show(A obj)
5.同上
6.执行A.class show(D obj) B中并没有重写。
7,8.实例对象为B,参数为B或者B的子类,执行show(B obj)
9.实例对象为B,参数为D,因为B继承自A,也可以执行A中的show(D obj)
其中:
A a2 = new B();
栈中的引用变量是A,堆中的实例变量是B。
将子类的实例,赋值给父类的引用。就是向上转型。
向上转型,在运行时,会遗忘子类对象中与父类对象中不同的方法。也会覆盖与父类中相同的方法–重写。(方法名,参数都相同)
所以a2,可以调用的方法就是,A中有的,但是B中没有的方法,和B中的重写A的方法。
理解了吧,少年!
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树