作者:手机用户2502870941 | 来源:互联网 | 2022-12-10 12:18
让我们说如果有两个类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();
}
}
B级:
public class B {
}
我的主要问题是:
为什么A a = new B();
不对?
为什么B b = new A();
是正确的?
T.J. Crowder..
8
那么为什么我们不能创建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...
}
所以一个实例Super
有一个数据插槽foo
:
+??????????????????+
| (Super instance) |
+??????????????????+
| foo: 0 |
+??????????????????+
一个实例Sub
有一个插槽foo
(因为它是一个 Super
),也是一个插槽bar
:
+??????????????????+
| (Sub instance) |
+??????????????????+
| foo: 0 |
| bar: 0 |
+??????????????????+
类型的变量Super
可以引用Sub
实例; 该实例具有a所具有的所有数据槽(和行为,未示出)Super
.但是类型变量Sub
不能引用Super
实例; 实例没有bar
数据槽(以及潜在的Sub
特定行为,未显示).
1> T.J. Crowder..:
那么为什么我们不能创建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...
}
所以一个实例Super
有一个数据插槽foo
:
+??????????????????+
| (Super instance) |
+??????????????????+
| foo: 0 |
+??????????????????+
一个实例Sub
有一个插槽foo
(因为它是一个 Super
),也是一个插槽bar
:
+??????????????????+
| (Sub instance) |
+??????????????????+
| foo: 0 |
| bar: 0 |
+??????????????????+
类型的变量Super
可以引用Sub
实例; 该实例具有a所具有的所有数据槽(和行为,未示出)Super
.但是类型变量Sub
不能引用Super
实例; 实例没有bar
数据槽(以及潜在的Sub
特定行为,未显示).