【发布时间】:2019-07-04 07:49:05
【问题描述】:
我遇到了与此问题类似的问题: Array of generic nodes Java
但是,将嵌套的 Node 类设为静态解决了一个问题,但为我创建了另一个问题。我写了一棵二叉树,每次节点的指针不应该指向任何东西(例如叶节点的左右指针或根的父指针)时,它实际上指向一个特殊的“nil”节点,其中不包含相关数据。 Nil 是二叉树的成员变量。
当我创建一个节点时,构造函数使所有指针都指向 nil。但是,如果我将 Node 类设为静态,以便创建节点数组(我需要为特定方法执行此操作),我会收到每个指针的错误消息“无法对非静态字段进行静态引用零。”但是,如果我将 nil 更改为静态,我会得到一个错误,上面写着“无法对非静态类型 T 进行静态引用”。 (我的节点保存参数化类型对象。)
这是我的 Node 类:
protected static class Node<T>{
Node left, right, parent;
T object;
protected Node(T x) {
object= x;
left= nil;
right= nil;
parent= nil;
}
}
这是 nil 指定和二叉树构造函数,它创建 nil 节点并使其成为根:
protected static Node<T> nil;
public BT() {
nil= new Node<T>(null);
root= nil;
}
如何让自己创建节点数组而不遇到这些静态与非静态问题?
【问题讨论】:
-
当指针不应该指向任何东西时,你有什么理由不简单地使用
null?此外,left、right和parent字段可能应该是Node<T>类型,而不是原始类型Node。 -
为什么 nil field 是静态的?是的,该类可能需要是静态的,但这并不意味着字段
nil也是如此。 -
我正在学习在线课程中的教科书(Pat Morin 的开放数据结构)。有时这家伙有一些非常复杂的代码,所以如果 nil 节点是不必要的,我不会感到惊讶。
-
@HovercraftFullOfEels 因为
nil是从静态上下文中引用的(在静态嵌套的Node构造函数中)。 -
@HovercraftFullOfEels 我同意,但如果你想在不使用
null值的情况下编写代码,那么就是这样。参见例如Are null references really a bad thing?我个人不同意。仅在类的实现中使用时,将null替换为nil并不能真正使代码不易出错。从 API 中消除null,例如使用Optional是另一回事。
标签: java arrays static nodes non-static