是否有一个正式的或权威性的定义;“取消引用”;在爪哇? 来自C和C++背景,我一直认为java中的去引用是通过引用访问对象的过程。p>

是否有一个正式的或权威性的定义;“取消引用”;在爪哇? 来自C和C++背景,我一直认为java中的去引用是通过引用访问对象的过程。p>,java,Java,例如,“ref”是一个引用,当用于访问它所引用的整数对象时,它被取消引用: Integer ref = new Integer(7); // Dereference "ref" to access the object it refers to. System.out.println(ref.toString()); 当取消引用过程失败时,会发生NullPointerException: Integer ref = null; // Dereferencin

例如,“ref”是一个引用,当用于访问它所引用的整数对象时,它被取消引用:

    Integer ref = new Integer(7);     
    // Dereference "ref" to access the object it refers to.
    System.out.println(ref.toString()); 
当取消引用过程失败时,会发生NullPointerException:

Integer ref = null;
// Dereferencing "ref" causes an exception.
System.out.println(ref.toString()); 
但是,我的解释与Oracle新产品上测试的一个主题冲突:

解释对象的生命周期(创建、通过重新分配解除引用和垃圾收集)

因此,根据创建Java 8考试的人的说法,在Java中取消引用是重新分配引用的行为,而不是评估引用的行为:

例如:

    // Create an Integer object, and a reference to it.
    Integer ref = new Integer(7); 
    ref = null; 
    // Now (according to Oracle?):
    // - The reassignment means ref has been "dereferenced".
    // - The dereferenced object is now eligible for Garbage Collection.
用谷歌搜索这一问题的趣闻意味着甲骨文的定义得到了更广泛的应用,但这并不意味着它是正确的,谷歌“通过重新分配解除引用”的唯一成功之处就是新的Java8考试!JLS在这两种情况下都没有发挥任何作用

在Java中,对去引用的真正含义是否有正式或权威的定义(与个人观点相反)?(即是否与评估或重新分配有关?)

两个完全不同的定义共存似乎很奇怪。

Java变量要么是中的“基元类型”,要么是中的“引用类型”(而不是特殊类型的null)。我从C++背景中来到java,总是发现最容易想到指针的引用类型,因为这使得最容易理解它们是如何工作的(尽管有),但是因为所有非原始变量都像没有评估的概念(没有等价于C++的指针的引用)。 因此,在您的示例中:

boolean truth = ...
String s = truth ? "yes" : null;
在第一行,在堆上创建一个对象,ref引用它。 在第二行中,ref更改为null。堆上不再有对对象的引用,因此它将有资格进行垃圾收集,但在垃圾收集器这样做之前,它实际上仍然存在(不包括这个简单示例中的任何聪明的JVM优化!)


顺便说一句,Java中没有“去引用”的正式定义。因为评估和赋值之间没有区别,所以它是有意义的,尽管我认为它不是一个广泛使用的术语。

虽然没有官方定义,但在一些Java错误语句中使用了“取消引用”一词

例如,如果您编写以下代码:

char ch = 'A';
if (ch.isLetter()) { }
您得到错误:
char不能被取消引用


因此,可以说,在
操作符的帮助下使用对象的引用访问对象的状态或行为是取消引用。

取消引用的另一个示例是:

String value; // the pointer

value = new String("Value 1");
// a "Value 1" String instance is created, referenced by "value" pointer

value = new String("Value 2"); 
// a new String instance created; "value" pointer is re-assigned to it
// the "Value 1" instance is now de-referenced

value = null;
// "Value 2" String instance is de-referenced
当一个对象不再被引用时,它可能会被垃圾回收 收藏家。重新分配给该类型或null的其他实例都将取消引用该实例

Java中是否有正式或权威的“去引用”定义

没有

您可以在JLS或JVM中找到“取消引用”的正式定义。我看了看,却找不到


我的直觉理解是,解除对它的引用意味着从一个引用到(松散地)引用“指向”的东西的一个组件的过程

以下是一些例子:

x = a.b;  // dereferences the value of 'a' to get the value of field 'b'
a.b();    // dereferences the value of 'a' to get the method 'b'
x = a[1]; // dereferences the value of 'a' to an array and then subscripts it
a[1] = 2; // dereferences the value of 'a' to an array, subscripts it
          // then assigns to the cell

// dereferences the value of 'l' to an object and acquires the
// object's primitive lock
synchronized (l) {
简而言之,每当您执行可能抛出NPE的基本操作时,都会涉及到解引用

请注意,这既不是“分配引用”,也不是(精确地)“评估引用”。例如:

boolean truth = ...
String s = truth ? "yes" : null;
涉及计算三个引用值表达式并指定一个引用,但不包括解引用。不会抛出NPE


好的,那么Java规范中对“取消引用”的解释是否有任何支持?我声称有

JLS第17章包含术语“取消引用”的唯一用法,我可以在最新版JLS中找到。在JLS 17.5.1中,
final
的语义被描述为“受解引用链的影响”,其定义如下:

“解引用链:如果动作
a
是由未初始化
o
的线程
t
读取或写入对象
o
的字段或元素,则必须存在一些由线程
t
读取的
r
以查看
o
的地址,从而
r解引用(r,a)

如果你拆开它的实际含义(在上下文中),我声称他们使用术语去引用的方式与我的第一个例子一致


这与C和C++中的引用引用操作符(<代码> */COD>)的含义一致;看见我还可以在其他Oracle文档中找到以这种方式使用的解引用示例;e、 g.

我个人从未听说过这个词用那种方式。看起来他们用它来表示取消引用,如“删除对的引用”。在我看来,措辞真的很糟糕。你有机会看到甲骨文认为对这个问题正确的答案吗?“两个完全不同的定义共存似乎很奇怪。”对我来说不是。语言总是超载的。这就是说,这个特殊的例子尤其令人困惑和不幸。@JohnKugelman最终也受到了“减少引用计数”思想的影响。(因为它与“对象生存时间”一起提到。)即使他们的JVM不进行引用计数。@5gon12eder“您有机会看到Oracle认为正确的答案吗…”?明确地说,甲骨文并不是在问问题;Oracle将此作为Java 8考试应该学习的主题!我想你的假设是正确的。约书亚·布洛赫-安补充说