Java中的内部类创建对self作为属性的引用

时间:2018-01-22 20:30:07

标签: java inner-classes

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

$stmt->bindValue('pi_classroom_id', null, 'string');
$stmt->bindValue('pi_classroom_name', $pi_classroom_name, 'string');
// ...

在我的Tree中插入Integer-Element后,我得到以下Tree对象(来自调试器):

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);

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

我的问题是:

  • 这个$ 0引用本身来自哪里?
  • 我该如何避免呢?

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

2 个答案:

答案 0 :(得分:2)

  

this$0-reference本身来自哪里?

它来自非静态类。

  

我该如何避免呢?

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

一旦你弄清楚如何不从你的代码中引用tree.this,那么TreeElementstatic将会删除对Tree的隐藏引用。

答案 1 :(得分:0)

这不是“自我的递归参考”。它是对通过其创建内部类对象的外部类的实例的非递归引用。您可以通过将内部类更改为静态来摆脱它,但如果从其中访问外部类的成员,这将导致其他代码问题。例如tree.this

这不是问题,所以你不需要解决它。