(1) 方法的多态性:重载、覆写;
(2) 对象的多态性:父子类对象的转换;
向上转型:子类对象变为父类对象,父类 父类对象 = 子类实例,自动转换;
向下转型:父类对象变成子类对象,子类 子类对象 = (子类) 父类实例,强制转换;
class A{
public void print(){
System.out.println("A");
}
}
class B extends A{ //继承A类
public void print(){ //方法覆写
System.out.println("B");
}
}
public class Main{
public static void main(String arg[]){
A a = new B(); //向上转型
a.print(); //调用覆写的方法
}
}
运行结果:B
本程序是一个对象向上转型,虽然对象调用对象的,但实例化的是子类对象,并且print()方法被子类覆写了,最终调用的是B类覆写的print()方法;方法的是A类的,但实例化的是子类对象,并且print()方法被子类覆写了,最终调用的是B类覆写的print()方法;
public class Main{
public static void main(String arg[]){
A a = new B(); //向上转型
B b = (B)a; //向下转型
b.print();
}
}
对象向下转型,本程序强制将父类对象变为了子类实例,由于本程序开始实例化的依然是子类对象( new B() ),最终调用的方法仍然是被覆写的print()方法。
public class Main{
public static void main(String arg[]){
A a = new A(); //没有转型
B b = (B)a; //向下转型
b.print();
}
}
运行结果:Exception in thread "main" java.lang.ClassCastException: A cannot be cast B
程序编译时未发生任何错误,但执行时发生ClassCastException错误提示,表示类转换异常;
所以:当对象发生向下转型关系前,一定要首先发生对象向上转型关系。
在发生向下转型操作前可以先判断一下再转型,使用instanceof关键字
对象 instanceof 类 → 返回Boolean型
例:a instanceof A;//返回true
实际情况中,向下转型使用的较少;
向上转型,主要用于统一参数,父类代表所有子类作为方法参数,此时子类不能扩充父类方法;
为了操作的方便,尽量不要向下转型操作,也尽量不要扩充方法;