S a = (S)new A();
让我们看看这里有什么:
- 可变
a
的的, 引用类型S
; - 一个实例创建表达式,产生一个对象类型
A
,其中A extends S
; - 一个 向上转型表达式参考 ,向上转型上述表达式成型
S
; - 将3.的结果分配给变量
a
。
阅读Java时,您必须牢记以下几点:
- 对象 的 类型 :对象永远不能更改其类型。在您的示例中,对象的类型为
A
; - 引用 的 类型 :在您的示例中,您将类型最初的引用转换为类型
A
的引用S
。您已将该引用分配给a
。
当您在对象上调用方法时,实际调用的方法完全不取决于 引用 的类型,而仅取决于 对象 本身的类型。
A因此,对象的类型
A就是类型中的方法被调用。
另一方面,当您访问实例变量时,多态性将不适用,并且引用的类型变得必不可少。随着
a.i您访问
i的超宣布
S,与
((A)a).i您访问
i的
A。请注意,该类
A拥有
两个 实例变量,都名为
i,您可以单独引用每个实例变量。
术语说明
术语“参考类型”实际上是更正确的“产生参考的表达类型”的简写。这是一个纯粹的编译时工件:在运行时没有与引用相关联的类型信息,它只是一种位模式。将此与对象的类型(仅是
运行时 工件)进行对比:编译器通常不知道表达式中所涉及的对象的类型,而只是对其进行 断言
。当此类断言在运行时失败时,结果是ClassCastException。



