所谓对象多态性即是指子类与父类之间的相互转换关系。
向上转型:父类 父类对象 = 子类实例 A a = new B()
向下转型:子类 子类对象 = (子类) 父类实例 B b = B a
只有先进行向上转型才能向下转型。
<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() ;
}
}
};
java中实现多态的机制是什么?
方法的覆写和重载是java多态性的不同表现。覆写是父类与子类之间多态性的一种表现,重载是一个类中多态性的一种表现。