所谓对象多态性即是指子类与父类之间的相互转换关系。
向上转型:父类 父类对象 = 子类实例
向下转型:子类 子类对象 = (子类) 父类实例
只有先进行向上转型才能向下转型。
<pre name="code" class="java">class A{ public void fun1(){ System.out.println("1、A类 --> public void fun1(){}") ; } public void fun2(){ this.fun1() ; } }; class B extends A{ public void fun1(){ // 将方法覆写了 System.out.println("2、B类 --> public void fun1(){}") ; } public void fun3(){ // 此操作为子类自己定义的,父类中不存在 System.out.println("3、B类 --> public void fun3(){}") ; } }; public class PolDemo02{ public static void main(String args[]){ A a = new B() ; // 发生向上转型关系,子类实例 --> 父类实例 B b = (B)a ; // 发生向下转型关系,强制 b.fun3() ; b.fun2() ; } };
让我们来看一个例子,通过实例来体现对象多态性在程序设计中的所用。
现在要求设计一个方法,该方法可以接收某个类所有子类的实例
首先给出三个类A、B、C
class A{ public void fun1(){ System.out.println("1、A类 --> public void fun1(){}") ; } public void fun2(){ this.fun1() ; } }; class B extends A{ public void fun1(){ // 将方法覆写了 System.out.println("2、B类 --> public void fun1(){}") ; } public void fun3(){ // 此操作为子类自己定义的,父类中不存在 System.out.println("3、B类 --> public void fun3(){}") ; } }; class C extends A{ public void fun1(){ // 将方法覆写了 System.out.println("4、C类 --> public void fun1(){}") ; } public void fun4(){ // 此操作为子类自己定义的,父类中不存在 System.out.println("5、C类 --> public void fun4(){}") ; } };
我们直接定义的接受子类实例的方法
public class PolDemo04{ 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()方法接收了A类所有子类的实例,但如果A类子类比较多,这样写将会需要大量的代码量
考虑到每一个子类都可以自动向上转型,我们可以利用这个特点
public class PolDemo06{ public static void main(String args[]){ fun(new B()) ; fun(new C()) ; } public static void fun(A a){ a.fun2() ; B b = (B)a ; b.fun3() ; } };
这样,就实现了我们目的,但考虑到传入fun函数的实例不确定是哪一个子类的对象,java设计者设计了一个instance()方法来辨别。
public class PolDemo08{ 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() ; } } };
时间: 2024-11-08 12:01:25