java 继承 子类强转父类 父类强转子类
2019-07-23 本文已影响0人
Sraindy
Java 继承
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
Java 子类强转父类
父类引用指向子类对象:
java中子类强转父类,实际上依然是子类;
该引用只能调用父类中定义的方法和变量;
如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;
// A是父类,B是子类
A a = new A();
a.setName("a1");
a.sayA(); // sayA
B b = new B();
b.setName("b1");
b.setSex(true);
b.sayA(); // sayA from B
b.sayB(); // sayB
// Java中的对象进行类型提升,依然保持其原有的类型。
A a2 = (A) b; // 子类强转父类,其实仍然是子类
System.out.println(a2.toString()); // B [name=b1, age=0, sex=true]
// 该引用只能调用父类中定义的方法和变量;
// a2.sayB(); // The method sayB() is undefined for the type A 报错
// 如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;
a2.sayA(); // sayA from B a2其实是B,调用的是B方法
Java 父类强转子类
只有父类对象本身就是用子类new出来的时候, 才可以在将来被强制转换为子类对象.
// B b2 = (B) a; // atest.A cannot be cast to atest.B a是A,转不成B
// 只有父类对象本身就是用子类new出来的时候, 才可以在将来被强制转换为子类对象.
B b2 = (B) a2; // a2其实是B,可以转成B
System.out.println(b2.toString()); // B [name=b1, sex=true]
b2.sayA(); // sayA from B
b2.sayB(); // sayB
public class TestObjectConvert {
public static void main(String[] args) {
test1();
test2();
}
private static void test1() {
Fruit fruit1 = new Fruit();
Apple apple1 = new Apple();
apple1 = (Apple) fruit1; // java.lang.ClassCastException
}
private static void test2() {
Fruit fruit1 = new Apple();
Apple apple1 = new Apple();
apple1 = (Apple) fruit1;
}
static class Fruit {
}
static class Apple extends Fruit {
}
}
结果是:
test1:报类转异常;
test2:转换正常。
所以,想让父类强制转换成子类,不是没有可能,除非父类是子类构造出来的实例,不然是不能强转的。为什么呢?如上代码,如果父类实例出来的对象是Orange,Orange当然不能强制转成Apple,所以说父类只有该子类对应的实例才能强转。
以上内容只为记录,地址来源如下:
[Java父类强制转换子类原则](https://blog.csdn.net/youanyyou/article/details/78990290)
[java 子类强转父类 父类强转子类](https://www.cnblogs.com/ooo0/p/9308583.html)