引用变量的数据类型(Java)

时间:2017-08-04 17:49:52

标签: java

我有一个引用变量的问题。我的问题是声明变量的类型是指对象的类型还是存储在其中的引用类型?

我找到了Edwin Dalorzo的一个非常有趣的答案 this主题。他描述了每个引用都有一个类型,当我们执行类型转换时,它只会改变用于引用该对象的引用的类型(而不是该对象本身的类型!)。

所以我的问题是引用变量的类型是否告诉我们哪种类型的引用存储在其中。当然,Object的类型和引用的类型是相同的。

假设B a = new B();

B现在是否告诉编译器a保持类型B的引用?

或者编译器是否完全忽略了存储在其中的数据类型(引用),只考虑底层对象的类型?方法返回类型相同。

2 个答案:

答案 0 :(得分:4)

引用有一个类型,它只能为它指定一个对象,该对象是该类型的实例(或子类或实现类)

编译器和JVM检查引用和对象的类型。

有些情况只有一个例如。

Thread t = null;
t.yield();

在这种情况下,会调用静态方法,并且不考虑参考的实际值。

相反,当使用反射时,引用的类型并不重要,只有底层对象。

答案 1 :(得分:2)

当编译器看到这一行时:

B a = new B();

之后“只会”知道以下事情:

  • a null
  • a具有“至少”类型B

喜欢在:

Object o = "hello";

编译器稍后会知道o实际上是一个String,而不是“只是”一个Object。从理论上讲,编译器也可以“记住”该附加部分(在某种程度上,例如在方法的范围内)。但javac,java到字节码编译器对于这种“复杂”的数据流考虑非常保守。

请记住:“性能”的Java方法是强调JIT编译器的运行时优化。从这个意义上讲,在扩展编译时间分析(不包括类型推断)方面花费大量精力并不是“值得”。