所谓对象多态性即是指子类与父类之间的相互转换关系。
向上转型:父类 父类对象 = 子类实例
向下转型:子类 子类对象 = (子类) 父类实例
只有先进行向上转型才能向下转型。
<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() ;
}
};考虑到每一个子类都可以自动向上转型,我们可以利用这个特点
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() ;
}
}
};原文:http://blog.csdn.net/u014492609/article/details/44205609