有些人可能会把继承和引用弄混,所以,这里就阐明一下,顺便聊聊今天的主题。
类与类之间通过『extends』关键字,联系起来就是继承!
继承也能传递,如下代码:
class Parent {
public void whoIs() {
System.out.println("I'm Parent class");
}
}
class Child extends Parent {
@Override
public void whoIs() {
System.out.println("I'm Child class");
}
}
class Son extends Child {
@Override
public void whoIs() {
System.out.println("I'm Son class");
}
}
那么,类 Son 间接继承了 Parent 类。
今天的正题:
- 假设 Parent 内存开销为 2M
- 假设 Child 内存开销为 1M
// 首先初始化两个对象实例
Parent parent = new Parent(); // 系统分配 2M 内存
Child child = new Child(); // 系统分配 3M 内存 (2M + 1M)
因为 Child 继承 Parent,所以,Child 实例化前会先实例化父类,即 Child 构造函数执行前,先执行 Parent 的构造函数,所以,子类才能调用父类的 public/protected 方法。
Parent p = (Parent)child; // OK!没问题
因为 child 的实例是 Child内存空间 + Parent内存空间,所以 此时的 p 实际上指向的是 child 中 Parent的内存空间,即 p 指向的是 3M 中的 2M 内存空间。
Child c = (Child)parent; // ClassCastException
同上的理论,parent 的实例只有 Parent的内存空间,此时类型转换时,parent 的内存空间中,没有 Child 的内存空间,因此,也就无法转换。
网友评论