向上转型和向下转型涉及到面向对象三大特性之一的继承,也就是子类和父类之间的关系。
这里以 父类 动物(Animal) 和子类 狗(Dog) 为例:
向上转型:顾名思义,就是把子类强转为父类。代码 Animal a = new Dog();
注意,这里的a是没有办法执行Dog类的独有方法的,因为JVM认为a 是Animal类型的。如果需要使用Dog类独有的方法,就要使用向下转型,也就是通俗意义上的强转。
向下转型:就是把父类强转为子类,代码:
Animal a = new Dog();
Dog d = (Dog)a; // 向下转型,这种写法是完全正确的
/** 下面这种写法会报错 */
Animal a = new Animal();
Dog d = (Dog)a; // 这里会报错,无法转换。
报错的原因很简单,因为你可以说狗是动物,但是你无法说动物是狗。
写了这么多,希望你能明白
作用是减少重复代码出现,使代码变得简洁。
向下转型是把父类对象转为子类对象。
例如下面代码:
[java] view plaincopyprint?
package com.wensefu.other1;
public class Girl {
public void smile(){
System.out.println("girl smile()...");
}
}
class MMGirl extends Girl{
@Override
public void smile() {
System.out.println("MMirl smile sounds sweet...");
}
public void c(){
System.out.println("MMirl c()...");
}
}
class Main{
public static void main(String[] args) {
Girl g1=new MMGirl(); //向上转型
g1.smile();
MMGirl mmg=(MMGirl)g1; //向下转型,编译和运行皆不会出错
mmg.smile();
mmg.c();
Girl g2=new Girl();
// MMGirl mmg1=(MMGirl)g2; //不安全的向下转型,编译无错但会运行会出错
// mmg1.smile();
// mmg1.c();
/*output:
* CGirl smile sounds sweet...
* CGirl smile sounds sweet...
* CGirl c()...
* Exception in thread "main" java.lang.ClassCastException: com.wensefu.other1.Girl
* at com.wensefu.other1.Main.main(Girl.java:36)
*/
if(g2 instanceof MMGirl){
MMGirl mmg1=(MMGirl)g2;
mmg1.smile();
mmg1.c();
}
}
}