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}
只要我一直点击,它就会一直持续下去,所以它是对自身的递归引用。
我的问题是:
- this$0 对自身的引用来自哪里?
- 如何避免?
根据我的理解,我的树对象应该只有一个具有 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
.
这不是问题,不需要解决。
我的 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}
只要我一直点击,它就会一直持续下去,所以它是对自身的递归引用。
我的问题是:
- this$0 对自身的引用来自哪里?
- 如何避免?
根据我的理解,我的树对象应该只有一个具有 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
.
这不是问题,不需要解决。