Tec*_*Sid 1 java inheritance class
让我们说如果有两个类A和B,其中A扩展B,所以按惯例A可以访问非私有的B成员.那么为什么我们不能创建B的对象并将该引用分配给A.
A类:
public class A extends B {
public static void main(String[] args) {
A a = new B();
B b = new A();
}
}
Run Code Online (Sandbox Code Playgroud)
B级:
public class B {
}
Run Code Online (Sandbox Code Playgroud)
我的主要问题是:
A a = new B();不对?B b = new A();是正确的?那么为什么我们不能创建B的对象并将该引用分配给A.
1)为什么
A a = new B();不正确?
因为A也(可能)拥有的功能B都没有,这样的情况下(这是B)不是一个A,这样你就可以不指定B实例的A-typed变量.
2)为什么
B b = new A();是正确的?
因为实例A 是 B实例,所以它们也可能比B实例多一些.因此,一个B-typed变量引用一个A实例是很好的(也很常见).请记住,继承是一种"是一种"关系.A extends B表示A实例是一个 B实例.
让我们使用更有意义的类名并包含一些状态:
class Super {
private int foo;
// ...details omitted...
}
class Sub extends Super {
private int bar;
// ...details omitted...
}
Run Code Online (Sandbox Code Playgroud)
所以一个实例Super有一个数据插槽foo:
+??????????????????+ | (Super instance) | +??????????????????+ | foo: 0 | +??????????????????+
一个实例Sub有一个插槽foo(因为它是一个 Super),也是一个插槽bar:
+??????????????????+ | (Sub instance) | +??????????????????+ | foo: 0 | | bar: 0 | +??????????????????+
类型的变量Super可以引用Sub实例; 该实例具有a所具有的所有数据槽(和行为,未示出)Super.但是类型变量Sub不能引用Super实例; 实例没有bar数据槽(以及潜在的Sub特定行为,未显示).
| 归档时间: |
|
| 查看次数: |
62 次 |
| 最近记录: |