Java 多态
在面向对象语言中,多态是继封装和继承之后的第三个基本特征。从一定程度来讲,封装和继承是实现多态的基础。
所谓多态就是同一个消息(方法)可以根据参数对象的不同而表现出不同行为。java中所有方法都是通过“动态绑定”来实现多态的,即程序在运行期间判断参数引用所指向的实际对象类型,然后根据实际对象类型调用其相应的方法,这样就可以只编写和基类打交道的代码。
多态的实现方式有:
- 接口的多个实现
- 继承父类进行方法重写
- 一个类中进行方法重载
多态的形象举例:word中按F1键是word的帮助文档,在eclipse中按F1键是eclipse的帮助文档
向上转型和向下转型
对象可以作为自己本身的类型来使用,也可以作为其基类型使用,将某个类基类型的引用当该类的引用的做法叫做向上转型,由于基类不会具有大于导出类的接口,因此向上转型是安全的,但同时会丢失具体的类型信息。
相反,通过向下转型可以重新获取类型信息,但是明显这样做是不安全的,因为无法知道一个”形状“到底是“圆”还是“三角形”。因此java会对所有转型进行检查,不安全的情况下则会抛出ClassCastException
类型转换异常。
class Useful {
public void f(){
System.out.println("Useful.f");
};
public void g(){
System.out.println("Useful.g");
};
}
class MoreUseful extends Useful {
public void f(){
System.out.println("MoreUseful.f");
};
public void g(){
System.out.println("MoreUseful.g");
};
public void h(){
System.out.println("MoreUseful.h");
};
}
public class RTTI {
static void testCast(Useful useful){
useful.f();
}
public static void main(String[] args) {
Useful useful = new MoreUseful();
((MoreUseful) useful).f(); //输出MoreUseful.f
Useful useful1 = new MoreUseful();
((MoreUseful) useful1).h(); //输出MoreUseful.h
// Useful useful1 = new Useful();
// ((MoreUseful) useful1).f(); //向下转型,这时会抛出java.lang.ClassCastException
MoreUseful moreUseful = new MoreUseful();
testCast(moreUseful); //向上转型,多态,输出MoreUseful.f
}
}