Java中引用变量的数据类型

4
我有一个关于引用变量的问题。我的问题是声明变量的类型是指对象的类型还是存储在其中的引用的类型?
我在这个主题上找到了Edwin Dalorzo非常有趣的答案。他描述了每个引用都有一个类型,当我们执行类型转换时,它只会更改用于引用该对象的引用的类型(而不是该对象本身的类型!)。
所以我的问题是,引用变量的类型是否告诉我们存储在其中的引用的类型。当然,对象的类型和引用的类型是相同的。
假设B a = new B(); 现在B是否告诉编译器a保存的是类型为B的引用?
还是编译器完全忽略存储在其中的数据(引用)的类型,并且只考虑底层对象的类型?方法返回类型也是如此。
2个回答

4

引用具有类型,只能将该类型的实例(或子类或实现类)分配给其引用的对象。

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

在某些情况下,只有一个问题是重要的,例如:

Thread t = null;
t.yield();

在这种情况下,调用静态方法时,不考虑引用的实际值。
反之,在使用反射时,引用的类型并不重要,只关心基础对象。

2
当编译器看到这行代码时:
B a = new B();

在此之后,它将“仅”知道以下几点:

  • a 不是 null
  • a 至少具有类型 B

例如:

Object o = "hello";

编译器无法在稍后知道o实际上是一个字符串,而不是“仅仅”一个对象。理论上编译器也可以“记住”这个额外的部分(在某种程度上,例如在方法范围内),但是java字节码编译器javac对于这些“复杂”的数据流考虑非常保守。
请记住:Java关于“性能”的方法是强调JIT编译器的运行时优化。从这个意义上说,花费很多精力来进行扩展的编译时分析(除了类型推断之外)是不值得的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接