关于null和java有很多问题。
我无法理解的是,人们所说的null意味着什么都没有,或者为什么要使用null。
我无法理解
之间的区别String thing = null;
和
String thing = "";
这个问题有详细的答案What is null in Java?,但我无法绕过它。
我错过了什么?
我研究过的语言(没有专家)
Python,vb(vb.net),网页编程(html,css,php,bit of js),sql
我应该补充一下,正是这个答案https://stackoverflow.com/a/19697058/2776866促使我写下这个。
答案 0 :(得分:6)
String str = null;
表示名为str的String引用,不指向任何内容
String str = "";
表示名为str的String引用,指向实际的String实例。对于该String实例,它是一个零长度的String,但它仍然是一个实际的对象。
只需稍微更新一些图表,希望可以帮助您想象:
假设我有
String nullStr = null;
String emptyStr = "";
String myStr = "ab";
概念上看起来像是什么:
// String nullStr = null;
nullStr ----------> X pointing to nothing
// String emptyStr = "";
+------------------+
emptyStr ---------> | String |
+------------------+
| length = 0 |
| content = [] |
+------------------+
// String myStr = "ab";
+------------------+
myStr ------------> | String |
+------------------+
| length = 2 |
| content = [ab] |
+------------------+
(当然,String对象的内部结构不是Java中的真实内容,只是为了给你一个想法)
更多编辑NULL背后的基本原理:
事实上,在某些语言中,它们不提供NULL的概念。无论如何,在Java(或类似语言)中,Null意味着与“空”对象在语义上不同。以String为例,我可能有People
类,其中包含String preferedTitle
属性。 Null preferedTitle
表示该人员有 NO 首选标题(因此我们需要派生并显示该标题),而{ {1}}是一个空字符串意味着 IS 是一个首选标题,并且没有显示任何内容。
答案 1 :(得分:4)
Java并不真正公开指针,而是处理引用。
当你说
时String thing = null;
你说有一个名为thing的引用(类型为string),它没有引用任何东西。
当你说
时String thing = ""
这是简写,
String thing = new String("");
现在您已初始化实际对象并准备使用。你告诉编译器创建一个字符串,现在你的“东西”引用了新的字符串。
如果你想知道你初始化字符串的长度,你可以去;
thing.length
哪个是零。该字符串存在,但长度为零。
在null版本上尝试string.length会导致NullReferenceException,这是编译器说的
“我试图找出你的字符串长度,但我找不到它!”
答案 2 :(得分:4)
String str
是对象的引用。也就是说,它不是一个实际的对象,而是一个可以包含对象地址的变量。为str
指定值时,您正在更改存储在其中的地址并更改它所处理的对象。
null
是指向无对象的参考值。你可以得到的几乎没有任何东西。如果将null
分配给字符串引用(String str = null;
),则无法使用该引用调用任何String方法 - 所有尝试都将导致NullPointerException。
""
是一个字符串,不包含任何字符 - 零长度。但它仍然是一个对象,如果将其地址分配给String引用变量(String str = "";
),则可以获取其长度,将其与另一个String进行比较,提取其hashCode等。
答案 3 :(得分:3)
实际上,null
表示“不适用于调用方法”。如果允许对象为null
,则必须在调用方法之前检查null
。
尝试在null
对象上调用任何方法都是无条件的错误。在几乎所有情况下,这也是一个编程错误,因为你应该
null
变量。另一方面,空对象允许您调用方法。例如,您可以找到空字符串的长度 - 它为零。您还可以迭代一个字符串,将其传递给期望非空字符串的方法,依此类推。
要想象这一点,请考虑使用Boolean
对象而不是String
。与只有两个状态的原始boolean
不同,即true
(“是”)和false
(“否”),Boolean
对象有三种状态:
第三个“不知道”状态对应null
。它既不是true
也不是false
州。您的程序可以使用此第三种状态 - 例如,您可以使用与null
的比较来查看是否已设置值,或将值设置为null
以“取消设置”其值。
答案 4 :(得分:2)
在Java null中,空字符串是两个不同的东西。
如果String为null,则无法访问其方法,因为它将抛出NullPointerException,但是如果String为""
,则String对象有效,您可以访问其方法。
例如
String a = null;
String b = "";
System.out.println (a.length()); // No Good
System.out.println (b.length()); // Prints 0
答案 5 :(得分:2)
概念上null
是一个特殊值,表示变量指向无效对象,因此它不会引用任何有效的内容,因为您无法访问其内容(变量或方法)。
你可以把它看作是一种特殊的条件,它已被添加到语言中,因为能够有指向什么都没有的指针是有用的。但是这里存在一些不一致,事实上有些语言通过强迫你获得有意义的(有意义的)值来阻止null
值的必要性。
您的示例有所不同,""
是一个有效对象:它是一个空字符串,而null
不是有效对象。
答案 6 :(得分:2)
让我们将它与Python进行比较。在Python中,等同于null
的是None
。
>>> test = ""
>>> test1 = None
这是设置一个空字符串和一个“null”字符串。
>>> test
''
>>> test1
None
在Python中,我们可以使用is
>>> test is None
False
>>> test1 is None
True
我们可以使用==
>>> test == ""
True
>>> test1 == ""
False
null
(如None
)缺少值。
答案 7 :(得分:2)
尽管许多面向对象的框架使用指针实现引用,但最好将引用视为“指向”对象,而不是“识别”它们[个人而言,我喜欢这个术语用于描述引用的“对象标识符”,因为术语“引用”在不同的上下文中有些过载]。尽管对象标识符不是人类可读的,但可以想象系统为每个对象赋予从1开始的相关数字,并且每个类型变量具有写入其上的对象编号或零。由于类型变量和数组槽默认为保持零,并且永远不会有第0个对象,因此未初始化的变量或数组槽的默认值变量不会识别有效对象。