多态是OOP的最后一个特征,方法的重载和覆写都属于多态性的一个体现,真正的多态还有一个对象多态的概念,对象的多态性主要是指,子类和父类对象的相互转换关系.
向上转型: 父类 父类对象 = 子类实例 (自动完成)
向下转型: 子类 子类对象 = (子类)父类对象 (强制完成)
示例1:
有2个类,Father是父类,Son类继承自Father。
Father f1 = new Son(); // 这就叫 upcasting (现在f1引用指向一个Son对象) Son s1 = (Son)f1; // 这就叫 downcasting (现在f1还是指向Son对象)
示例 2:
Father f2 = new Father(); Son s2 = (Son)f2; // 出错,子类引用不能指向父类对象,ClassCastException类转换异常.
两个没有关系的类进行相互的对象转换操作.
示例1正确是因为f1指向一个子类对象,Father f1 = new Son(),子类s1引用当然可以指向子类对象了。
示例2中f2 被传给了一个Father对象,Father f2 = new Father(),子类s1引用不能指向父类对象.
1. 父类引用指向子类对象,而子类引用不能指向父类对象.
2. 把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转换.
如:Father f1 = new Son().
3. 把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转换.
注:向上转型后调用的方法是子类的方法。原因是转型对象实际指向的是子类,故调用时会调用子类本身的方法。但向上转型时对象会遗失除与父类对象共有的其他方法.向下转型前可以通过instanceof来防止出现异常.
示例:
代码中A类为父类,B,C为子类,除了父类的fun1,fun2方法,各自分别有自己的fun3和fun4方法.
public class UpcastDemo{ public static void main(String args[]){ fun(new B()) ; fun(new C()) ; } public static void fun(A a){ a.fun2() ; } };因为向上转型的存在我们不需要提前知道具体是那个子类要调用 fun2方法 ,这样便于抽象管理 .不然实际的代码会如下 :
public class NotUpcastDemo{ public static void main(String args[]){ fun(new B()) ; fun(new C()) ; } public static void fun(B b){ b.fun2() ; b.fun3() ; } public static void fun(C c){ c.fun2() ; c.fun4() ; } };这样如果有多少个子类就得定义多少个 fun方法 ,不便于维护和管理 .但是如果子类要向下转型并调用自己独有的方法呢 ?则可以如下操作 ,用 instanceof判断具体的子类 .
用法: 对象 instanceof 类 //返回的是boolean值.
public class DowncustDemo{ public static void main(String args[]){ fun(new B()) ; fun(new C()) ; } public static void fun(A a){ a.fun2() ; if(a instanceof B){ B b = (B)a ; b.fun3() ; } if(a instanceof C){ C c = (C)a ; c.fun4() ; } } };向下转型中 instance判断很重要 ,防止转换异常 .继承关系中 ,父类的设计非常重要 ,设计合理会给代码开发带来很大的简便性 .
20150414
JAVA学习笔记系列
--------------------------------------------
联系方式
--------------------------------------------
Weibo: ARESXIONG
E-Mail: [email protected]
------------------------------------------------