我了解到,由于 Java 是静态类型语言,因此每个变量都有静态类型和动态类型。
然而,关于变量是静态还是动态的讨论实际上总是在引用变量的上下文中,而不是原始变量,所以我对是否可以使用术语“静态类型”和“动态”犹豫不决type' 当涉及到原始变量时(也许是因为在尝试谈论原始类型的静态和动态类型时并没有太多内容[因为它们将是相同的],但是当谈论参考变量时,这些术语的用法就变成了由于多态性而富有成效)。
例如,如果我们有A
继承自 Class 的 ClassB
并且我们编写B b = new A();
,那么静态/编译时类型b
是B
,但它的动态/运行时类型是A
。
我想知道,如果我们写例如 ,int num = 5;
那么可以说 is 的静态类型和isnum
的int
动态类型吗?num
int
此外,是否存在原语的静态类型和动态类型不同的情况?我试图通过写作来思考这样一个例子,但是除非我使用强制转换(在这种情况下不会发生自动装箱),int a = 5.5;
否则这种变量的定义不会编译。5.5
我认为原语的静态和动态类型总是相同的,但我无法证明这一点。我的这种想法正确吗?它的理由是什么?
提前感谢您的帮助!
让我们准确一点。Java 语言规范写道:
第 4 章类型、值和变量
Java 编程语言是一种静态类型语言,这意味着每个变量和每个表达式都有一个在编译时已知的类型。
然后:
4.12.1。原始类型的变量
原始类型的变量始终保存该原始类型的原始值。
4.12.2。引用类型的变量
类类型 T 的变量可以保存空引用或对类 T 的实例或作为 T 的子类的任何类的实例的引用。
接口类型的变量可以保存空引用或对实现该接口的任何类的任何实例的引用。
如您所见,原始类型的变量只能保存该类型的值,而引用类型的变量可以保存对该类型或其任何子类型的对象的值(引用)。
因此,值类型和变量类型之间的差异只能存在于引用类型中。
请注意,规范讨论了变量的类型(称为静态类型)和对象的类型(称为动态类型)。说变量具有动态类型是荒谬的,因为变量是静态的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句