Java中的NULL和Java中的null有什么区别?

时间:2010-06-02 17:54:59

标签: java c++ null

我一直想弄清楚为什么C ++让我疯狂地打字NULL。前几天它突然袭击了我;多年来我一直在Java中键入null(小写)。现在我突然想用C ++编程,而那一小块肌肉记忆让我疯狂。

Wikiperipatetic将C ++ NULL定义为stddef的一部分:

  

扩展为空指针的宏   不变。它可以定义为   ((void *)0),0或0L取决于   编译器和语言。

Sun的文档告诉我关于Java的“null literal”:

  

null类型有一个值,null   参考,由文字表示   null,由ASCII组成   字符。始终是空文字   null类型。

所以这一切都非常好。我知道空指针引用是什么,并感谢编译器注释。现在我对Java中的文字的想法有点模糊,所以我继续阅读......

  

文字是源代码   表示固定值;   文字直接表示   你的代码没有要求   计算

     

还有一个特殊的空文字   可以用作任何值的值   参考类型。可以分配null   到任何变量,除了变量   原始类型。你没什么   可以使用null值   测试它的存在。因此,   null经常在程序中用作   标记表示某个对象是   不可用。

好的,所以我想我现在就明白了。在C ++中,NULL是一个宏,在编译时,它将计算为空指针常量。在Java中,null是一个固定值,任何非基元也可以分配;非常适合在方便if statement进行测试。

Java没有指针,所以我可以看到为什么它们保持null是一个简单的值,而不是任何花哨的东西。 但是为什么java决定将所有上限NULL更改为null

此外,我在这里错过了什么吗?

10 个答案:

答案 0 :(得分:23)

  • NULL是一个预处理程序指令标识符,根据惯例,它们应该全部大写。

  • null是一种语言文字,代表一个常量值,并且应该按照惯例全部更低(就像truefalse)。

答案 1 :(得分:20)

Java的null更像是C ++ 0x的nullptr。 C ++中的NULL只是0,最终可以解析为int而不是像你想要的指针。考虑:


void f(int);
void f(char*);

...

f(NULL); // which f()?

C ++ 0x有nullptr,它解决了这个问题,但它仍然不会完全等同于Java的null。他们只是不同的语言。

哦,另一个不同之处在于Java没有指针(或者说它没有)。在Java中,您可以合法地为引用分配null,在C ++中,如果没有使用格式错误的构造,则无法执行此操作。不可否认,如果没有这种能力,Java就会毫无用处,但这绝对是另一个重要的区别。

答案 2 :(得分:6)

关于你的上一个问题,我不确定小写null背后的设计原理是什么, 但我认为目标是使null成为语言级文字(如真或假)而不是常量。

java中的关键字通常是小写的,因此命名为文字。常量(如Integer.MAX_VALUE)通常是大写的。

答案 3 :(得分:2)

使用0代替NULL

由该语言的创建者Bjarne Stroustrup撰写的“The C ++ Programming Language”一书:

  

在C中,定义宏NULL以表示零指针已经很普遍。因为   C ++更严格的类型检查,使用普通0而不是任何建议的NULL宏,可以减少问题。如果您认为必须定义NULL,请使用const int NULL = 0;

答案 4 :(得分:2)

不,你已经得到了它。在C ++中,空指针是分配给指针的任何文字零值。 NULL只是0的一个宏,因此ptr = 0ptr = NULL是相同的。它仅用于方便/可读性。它是大写的原因是因为在C和C ++中有一个长期惯例,宏的名称应该是大写的。

在Java中,null是一个内置的文字,因为它不是宏(并且Java无论如何都没有宏的概念),所以没有令人信服的理由将其设为大写。

答案 5 :(得分:2)

Java null关键字用于将变量标识为不引用任何对象。无法将null关键字分配给使用基本数据类型声明的变量。 C ++ NULL值是一个定义为0的常量。

答案 6 :(得分:1)

  

在C ++中,NULL是一个宏,当时   编译后,定义空指针   恒定。

这是你弄错了。在C ++中,NULL为0,没有别的。指针和整数都可以为NULL。

另一方面,在java中,null是一个空指针,这意味着只有对象可以为null。

答案 7 :(得分:1)

Java没有指针,就像你自己说的那样,这就是为什么“null”的概念在Java和C ++之间是完全无法比拟的。

你的问题与“角度和苹果之间有什么区别”一样有意义,即除了显而易见的问题之外,它无法以任何其他方式回答:{+ 1}}在C ++中NULL在Java中,有两个完全无关的概念。

Java从未“决定”将所有上限null更改为NULL,因为Java的null再一次与C ++的null无关。

答案 8 :(得分:0)

嗯,我不知道为什么java要求将NULL更改为null,但是大写更难以键入(至少在我的考虑中)。但你可能总是问太阳:-P。无论如何,说java没有指针是不完全正确的,因为java或c#中的普通引用或者像c ++中的refferences更像是指针。例如,在c ++中,引用不能为NULL,但java中的引用可以。并且c ++中的引用不能改变它所指向的变量(我可能在这一点上错了),但java引用可以。

答案 9 :(得分:0)

指针基本上是内存地址。并且只有一个众所周知且已建立的内存地址,0。c ++ NULL是大写的,因为它是一个预处理器宏,它们总是按惯例大写。指针概念直接映射到硬件中的地址空间概念。

Java使用引用,它有自己的内部表示方式。有一个众所周知的参考,null。它是小写的,因为它基本上是另一个符号,虽然指的是字面值。我不认为它们“改变”了从C到Java的任何东西。我认为他们只是想要null概念,所以他们称之为“null”。

在这两种情况下,null都允许函数返回其他信息。它可以返回结果的地址可能操作不成功的事实。