Java中的类的继承关系中,有向上转型与向下转型两种。
当父类的引用指向子类对象时,称为向上转型。比如Father是父类,Son是子类,则Father father=new Son()这种就是向上转型;这个时候执行的是指向的子类对象的方法。如下
public class Father {
public void eat() {
System.out.println("父类的吃方法");
}
}
public class Son extends Father {
public void eat() {
System.out.println("子类的吃方法");
}
public static void main(String[] args) {
Father father = new Son();//向上转型
father.eat();
}
}
输出
子类的吃方法
这个时候把子类对象赋给父类引用变量,这很自然,儿子总是要升任为父亲,这时候不需要强制类型转换。父类引用可以指向子类对象。可记成父亲可以指着儿子的鼻子教育。
把父类的引用变量赋给子类引用时,称为向下转型。老爹要变成儿子,这个时候需要强制类型转换。比如上面的Son 与Father,如果Son son=(Son )father;这个就是向下转型。还有一种情况,比如Father father=new Father ();Son son=(Son )father;这种也是向下转型,但是因为子类引用不能指向父类对象,可记成儿子不可以指着父亲的鼻子教育,所以会报ClassCastException的错。还有,没有继承关系的两个类之间,也会报ClassCastException的错。比如Object obj=new Integer(2);Object是所有类的父类,实际的话执行的是Integer类的方法,现在是Integer类型,String s=(String)obj;这时把Integer类型强转成String类型,这时候就会报ClassCastException的错。在项目中,如果为了避免出现ClassCastException的情况,我们一般会先使用Instanceof 运算符来判断是否可以成功转换。这样可以使程序更加的健壮。
如上两个的例子,
public class Father {
public void eat() {
System.out.println("父类的吃方法");
}
}
public class Son extends Father {
public void eat() {
System.out.println("子类的吃方法");
}
public static void main(String[] args) {
Father father = new Father();//向下转型
if (father instanceof Son) {
Son son = (Son) father;
son.eat();
}
}
}
Object obj = new Integer(2);
if (obj instanceof String) {
String s = (String) obj;
}