2017-08-04 73 views
4

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

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

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

假设B a = new B();

不B现在告诉大家,一个拥有B型的引用,编译器?

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

回答

4

基准有一个类型,并且它可以仅具有一个参考分配给它的对象,它是该类型的一个实例(或子类或实现类)

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

在某些情况下,只有一个比如

Thread t = null; 
t.yield(); 

在这种情况下,调用静态方法,并且不考虑参考的实际值。相反,当使用反射时,其中参考的类型并不重要,只有底层对象。

2

当编译器看到这一行:

B a = new B(); 

它将 “只是” 知道下面的东西算账:

  • 一个是
  • 一个具有 “至少” B型

喜欢在:

Object o = "hello"; 

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

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