null 是一个对象吗?我绝对可以说不是。从某种意义上说,
(null instanceof Object)
它将赋予价值false
。以下是您还需要了解的有关 null 的信息:
- 不能调用值为 null 的方法:当值为 null 并且该方法是非静态
x.m()
时,它将引发错误。顺便说一句,如果它是静态方法,则一切都很好,因为只有类是重要的,并且值被忽略。x
m
m
x
- 所有类都只有一个 null,而不是每个类都有一个单独的 null。因此,
((String) null == (Hashtable) null)
举例来说。 - 如果方法允许的话,将 null 作为参数传递给方法是完全可以接受的(有些方法允许 null 参数,有些则不允许)。例如,你可能会写
System.out.println (null)
,但butstring.compareTo (null)
它不会起作用。因此,如果不完全明显,请务必在方法的 javadoc 注释中指出是否可以接受 null 作为其参数。 - 在 JDK 从 1.1 到 1.1.5 版本中,将 null 作为字面参数传递给匿名内部类的构造函数(例如,
new SomeClass(null) { ...}
会导致编译器错误)。但是,您可以传递值为 null 的表达式,或者传递强制的空,形式为new SomeClass((String) null) { ...}
- 至少有三种不同的情况,通常使用 null 来表示:
- 未初始化(未初始化)。尚未分配任何值的变量或槽。
- 不存在/不适用。例如,二叉树的终端节点可以称为具有空子节点的普通节点。
- 空 (某物的空虚)。例如,您可以使用 null 来表示空树。请注意,这与前面的情况有很大不同(它们在实践中经常被混淆)。区别在于 null 是否是可接受的树节点,或者 null 是否表示该值不需要被视为树节点。
-
// null означает «не применимо» // Здесь нет пустого дерева. class Node { Object data; Node left, right; void print() { if (left != null) left.print(); System.out.println(data); if (right != null) right.print(); } }
-
// null означает пустое дерево // обратите внимание на статические и нестатические методы class Node { Object data; Node left, right; void static print(Node node) { if (node != null) node.print(); } void print() { print(left); System.out.println(data); print(right); } }
-
// Отдельный класс для Empty // null не используется interface Node { void print(); } class DataNode implements Node{ Object data; Node left, right; void print() { left.print(); System.out.println(data); right.print(); } } class EmptyNode implements Node { void print() { } }
比较二叉树节点的三种实现与顺序控制台输出方法:
GO TO FULL VERSION