Java 中的内部 Class 创建对自身的引用作为属性

Inner Class in Java creates reference to self as attribute

我的 Java 程序中有一个简单的 class,它模拟泛型类型的 BST。在这个 class 中有一个内部 class 模拟 BST 的节点。

public class Tree<T extends Comparable<T>> {
  private class TreeElement {
    private T element;
    private TreeElement left = null;
    private TreeElement right = null;

    public TreeElement(T element){
      this.element=element;
    }
  }

  public TreeElement root=null;
  public void insert(T element) {
    if (root==null){
      root=new TreeElement(element);
      return;
    }
   //More Code here that is not relevant
  }
}

Tree tree = new Tree();
tree.insert(5);

在我的树中插入一个整数元素后,我得到以下树对象(来自调试器):

tree = {Tree@1147} 
 root = {Tree$TreeElement@1157} 
  element = {Integer@1155} 5
  left = null
  right = null
  this[=13=] = {Tree@1147} 
   root = {Tree$TreeElement@1157} 
    element = {Integer@1155} 5
    left = null
    right = null
    this[=13=] = {Tree@1147} 

只要我一直点击,它就会一直持续下去,所以它是对自身的递归引用。

我的问题是:

根据我的理解,我的树对象应该只有一个具有 3 个属性(元素、左、右)的根对象。

Where does the this[=10=]-reference to itself come from?

它来自 class 非静态。

How do I avoid it?

此引用使您的代码能够引用 tree.this。你无法摆脱它,除非你愿意通过某种替代方式向使用它的方法提供 tree.this(例如,始终将其作为参数传递)。

一旦你弄清楚如何不从代码中引用 tree.this,使 TreeElement class static 将摆脱对 [=16= 的隐藏引用].

这不是 'recursive reference to self'。它是对创建内部 class 对象的外部 class 实例的非递归引用。您可以通过将内部 class 更改为静态来摆脱它,但是如果您从其中访问外部 class 的成员,这将导致其他代码问题。比如tree.this.

这不是问题,不需要解决。