什么是null
?
null
是否是任何事实?
null
属于哪一套?
它如何在记忆中表现出来?
答案 0 :(得分:295)
答案 1 :(得分:29)
null是否为任何实例?
没有。这就是null instanceof X
将为所有类false
返回X
的原因。 (不要被你可以将null
分配给类型为对象类型的变量这一事实所愚弄。严格地说,赋值涉及隐式类型转换;请参阅下文。)
'null'属于哪个集合?
它是null类型的唯一成员,其中null类型定义如下:
“还有一个特殊的null类型,表达式的类型为null,没有名称。因为null类型没有名称,所以无法声明null类型的变量或者转换为null类型.null引用是null类型表达式唯一可能的值。null引用总是可以转换为任何引用类型。实际上,程序员可以忽略null类型,只是假装null只是一个特殊的可以是任何引用类型的文字。“ JLS 4.1
什么是null?
见上文。在某些情况下,null
用于表示“无对象”或“未知”或“不可用”,但这些含义是特定于应用程序的。
它如何在记忆中表现出来?
这是特定于实现的,您将无法在纯Java程序中看到null
的表示。 (但是null
在大多数(如果不是全部)Java实现中都表示为零机器地址/指针。)
答案 2 :(得分:13)
什么是null?
没什么。
null是否为任何实例?
不,因为它什么都不是它不能成为任何事物的实例。
null属于哪个集合?
没有任何设置
它在内存中的表现如何?
如果某些参考指向它:
Object o=new Object();
在堆内存中分配给新创建对象的一些空间。 o将指向内存中指定的空间。
现在o=null;
这意味着现在o不会指向对象的内存空间。
答案 3 :(得分:8)
不,它不是任何实例,instanceof总是错误的。
答案 4 :(得分:6)
答案 5 :(得分:5)
Java中的空(tm)
在C和C ++中,“NULL”是头文件中定义的常量,其值如下:
0
或:
0L
或:
((void*)0)
取决于编译器和内存模型选项。严格来说,NULL不是C / C ++本身的一部分。
在Java(tm)中,“null”不是关键字,而是null类型的特殊文字。它可以转换为任何引用类型,但不能转换为任何基本类型,如int或boolean。 null文字不一定具有零值。并且无法转换为null类型或声明此类型的变量。
答案 6 :(得分:4)
Null不是任何类的实例。
但是,您可以为任何(对象或数组)类型的变量赋值null:
// this is false
boolean nope = (null instanceof String);
// but you can still use it as a String
String x = null;
"abc".startsWith(null);
答案 7 :(得分:4)
字节代码
Java的null
具有直接的JVM支持:使用三条指令来实现它:
aconst_null
:例如将变量设置为null
,如Object o = null;
ifnull
和ifnonnull
:例如:将对象与null
if (o == null)
进行比较
Chapter 6 "The Java Virtual Machine Instruction Set "然后提及null
对其他指令的影响:它会为其中许多指令抛出NullPointerException
。
2.4. "Reference Types and Values"也用通用术语提到null
:
参考值也可以是特殊的空引用,对无对象的引用,这里将用null表示。 null引用最初没有运行时类型,但可以转换为任何类型。引用类型的默认值为null。
答案 8 :(得分:3)
null
是特殊值,它不是任何事物的实例。显然,它不能是instanceof
任何东西。
答案 9 :(得分:2)
null
是一个特殊值,不是任何类的实例。以下程序说明了这一点:
public class X {
void f(Object o)
{
System.out.println(o instanceof String); // Output is "false"
}
public static void main(String[] args) {
new X().f(null);
}
}
答案 10 :(得分:1)
null类似于/类似于C ++中的nullptr。
C ++程序:
class Point
{
private:
int x;
int y;
public:
Point(int ix, int iy)
{
x = ix;
y = iy;
}
void print() { std::cout << '(' << x << ',' << y << ')'; }
};
int main()
{
Point* p = new Point(3,5);
if (p != nullptr)
{
p->print();
p = nullptr;
}
else
{
std::cout << "p is null" << std::endl;
}
return 0;
}
Java中的相同程序:
public class Point {
private int x;
private int y;
public Point(int ix, int iy) {
x = ix;
y = iy;
}
public void print() { System.out.print("(" + x + "," + y + ")"); }
}
class Program
{
public static void main(String[] args) {
Point p = new Point(3,5);
if (p != null)
{
p.print();
p = null;
}
else
{
System.out.println("p is null");
}
}
}
现在您是否从上面的代码中了解了Java中的null?如果没有,那么我建议你学习C / C ++中的指针然后你会理解。
请注意,在C中,与C ++不同,nullptr是未定义的,但是使用了NULL,也可以在C ++中使用,但在C ++中,nullptr比仅使用NULL更优选,因为C中的NULL始终与指针,就是这样,所以在C ++中,后缀“ptr”被附加到单词的末尾,而且所有字母现在都是小写的,但这不太重要。
在Java中,每个类型非原语的变量总是引用该类型的对象或继承而null是null类对象引用,但不是空指针,因为在Java中没有这样的东西“指针”,但是相反,使用对类对象的引用,而Java中的null与类对象引用相关,因此您也可以将其称为“nullref”或“nullrefobj”,但这很长,所以只需将其称为“null”。
在C ++中,你可以使用指针和可选成员/变量的nullptr值,即没有值的成员/变量,如果它没有值,那么它等于nullptr,所以如何null例如,可以使用Java。
答案 11 :(得分:0)
在我看来,在java中看到null的有趣方法是将其视为不表示缺少信息的东西,而只是作为可以分配给任何类型的引用的文字值。如果你考虑它,如果它表示缺少信息,那么a1 == a2为真是没有意义的(如果它们都被赋值为null),因为它们可能真的可以指向任何对象(我们只是不知道他们应该指向哪些对象)...顺便说一句,null == null在java中返回true。如果java例如就像SQL:1999然后null == null将返回unknown(SQL中的布尔值:1999可以采用三个值:true,false和unknown但实际上未知在实际系统中实现为null)... {{3 }}
答案 12 :(得分:0)
Java中有两种主要的类型:原始和引用。声明为基本类型的变量存储值;声明引用类型的变量存储引用。
String x = null;
在这种情况下,初始化语句声明变量“x”。 “x”存储字符串引用。这里 null 。首先,null不是有效的对象实例,因此没有为其分配内存。它只是一个值,表示对象引用当前不是指对象。
答案 13 :(得分:0)
简短而精确的答案,正式回答了JLS的所有问题:
3.10.7。 Null Literal
null类型有一个值,空引用,由 null literal null,由ASCII字符组成。
null文字始终为null类型。
仅分配分配给null的类型的引用。您没有为引用分配任何值(对象)。 这种分配特定于JVM将花费多少引用以及将分配哪个内存区域。