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

标签 java inner-classes

我的 Java 程序中有一个简单的类,它对泛型类型的 BST 进行建模。在这个类中,有一个内部类对 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$0 = {Tree@1147} 
   root = {Tree$TreeElement@1157} 
    element = {Integer@1155} 5
    left = null
    right = null
    this$0 = {Tree@1147} 

只要我继续点击,这种情况就会持续下去,所以它是对其自身的递归引用。

我的问题是:

  • 对自身的 this$0 引用从何而来?
  • 如何避免这种情况?

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

最佳答案

Where does the this$0-reference to itself come from?

它来自非静态类。

How do I avoid it?

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

一旦你弄清楚如何不从代码中引用tree.this,使TreeElementstatic将摆脱隐藏的引用到

关于java - Java 中的内部类创建对 self 的引用作为属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48389773/

相关文章:

java - 方法内重载构造函数 InnerClass

java - 如何在静态方法中实例化非静态内部类?

java - 泛型实际上如何像参数一样工作?

java - 一起使用 Neo4j Core Java API 和终端控制台

python - Python 3.5 内部类(枚举)中静态/类列表/字典的初始化

scala - 不同文件中的内部类

java - 从 Web 应用程序控制 USB 设备

java - 为什么向下转换在 C++ 中是一种不好的做法,而不是在另一种语言中?

java - 如何找到 FileItemIterator 返回的 FileItemStream 的编码?

Java 反射 - 使用接受接口(interface)作为参数的公共(public)构造函数调用 protected 类