在java中面向对象的三大特性是封装、继承和多态。多态的具体表现在对方法的重写和重载。重载,方法参数不一样;重写,方法参数一样,具体实现不一样。看上去,多态和向上/向下转型没有什么关系,继续往下看。(这里主要还是讲向上/向下转型)
java中,向上转型是指弗雷对象的引用指向子类对象。而向下转型是基于向上转型再次指向子类的对象。
1.向上转型
语法:父类 = new 子类(); 如下示例:
public class Father{
public void say(){
System.out.println("father say");
}
public static void main(String[] args){
Father son = new Son();//向上转型
son.say();
}
}
public Son extends Father{
public void say(){
System.out.println("son say");
}
}
最后输出的结果是:son say
这是因为,父类对象的引用指向的是一个子类,所以最后打印出来的是子类的方法。
2.向下转型
语法: 父类 对象1 = new 子类(); 子类 对象2 = (子类)对象1; 示例如下:
public class Father{
public void say(){
System.out.println("father say");
}
public static void main(String[] args){
Father son = new Son();//先向上转型
Son son2 = (Son)son;//向下转型
son2.sayMe();
}
}
public Son extends Father{
public void say(){
System.out.println("son say");
}
public void sayMe(){
System.out.println("son sayMe");
}
}
如果对象不先进行向上转型,直接将父类强转成子类对象系统就会报错!
Exception in thread "main" java.lang.ClassCastException: Father cannot be cast to Son
at Father.main(Father.java:6)
讲了这么多,似乎还是和多态没有扯上半毛钱关系。
再讲一个虚拟机调用方法的机制。当虚拟机调用一个类方法时,会基于对象引用的类型来选择所调用的方法。相反,当调用一个实例方法时,则是基于对象实际的类型(只能在运行时得知)来选择所调用的方法,这就是动态绑定,也是多态的一种 。(是不是开始多态扯上关系了?)
动态绑定具体表现在向上转型上,因为只有在运行的时候才知道具体运行的是哪个实例。示例代码和向上转型一样。具体关于动态绑定和静态绑定大家可以看看这篇博客http://blog.youkuaiyun.com/zhangjk1993/article/details/24066085