多态的向上向下转型都是针对于编译时类型,运行时的类型从始至终都不会改变,即在new的时候创建是哪个类型的对象就是哪个类型的对象。
向上转型导致“向父类转型的子类对象调用子类特有方法”即使运行时无错也无法通过编译,若想调用子类特有方法应该解决此编译出错问题。
- 解决方法:向下转型。将经历过向上转型的子类对象再强制“转回来”。
-
转回来意思是,不能转成除本子类以外的其他类。如果转成除本子类以外的其他类,编译不报错但运行时会出现ClassCastException
package poly;
/*
* 向上转型导致“向父类转型子类对象调用子类特有方法”即使运行时无错也无法通过编译,若想调用子类特有方法应该解决此编译出错问题。
* 解决方法:向下转型。将经历过向上转型的子类对象再强制“转回来”。
* 转回来意思是,不能转成除本子类以外的其他类。如果转成除本子类以外的其他类,编译不报错但运行时会出现ClassCastException
* */
public class DownCast {
public static void main(String[] args) {
/*错误向下转型:将没向上转型的父类对象转到子类*/
Person3 per1 = new Person3();
// Chinese3 chi1 = (Chinese3) per1; //编译不报错但运行时会出现ClassCastException
// chi1.uniqueMethod();
/*使用instanceof判断能否向下转型*/
System.out.println(per1 instanceof Chinese3);
if (per1 instanceof Chinese3) {
Chinese3 chi1 = (Chinese3) per1;
chi1.uniqueMethod();
}
/*错误向下转型:将向上转型的子类对象转到了其他子类*/
Person3 per4 = new Chinese3();
// Janpan3 jan2 = (Janpan3) per4; //编译不报错但运行时会出现ClassCastException
// jan2.uniqueMethod();
/*使用instanceof判断能否向下转型*/
System.out.println(per4 instanceof Janpan3);
if (per4 instanceof Janpan3) {
Janpan3 jan2 = (Janpan3) per4;
jan2.uniqueMethod();
}
/*正确向下转型:将向上转型的子类对象转回来*/
Person3 per2 = new Chinese3();
// Chinese3 chi2 = (Chinese3) per2; //正确使用,编译和运行都不报错
// chi2.uniqueMethod();
System.out.println(per2 instanceof Chinese3);
if (per2 instanceof Chinese3) {
Chinese3 chi2 = (Chinese3) per2;
chi2.uniqueMethod();
}
}
}
class Person3 {
public void eat() {
System.out.println("人吃饭");
}
}
class Chinese3 extends Person3 {
@Override
public void eat() {
System.out.println("中国人吃饭");
}
public void uniqueMethod() {
System.out.println("中国人特有方法");
}
}
class Janpan3 extends Person3 {
@Override
public void eat() {
System.out.println("日本人吃饭");
}
public void uniqueMethod() {
System.out.println("日本人特有方法");
}
}