我对java中的 null 感到困惑。 Book说如果我们声明一个没有初始化的引用类型的变量,该变量将具有默认值 null 。所以我试试这个
import edu.princeton.cs.algs4.*;
public class test
{
public static void main(String[] args)
{
String a;
StdOut.println(a);
}
}
然而,java中的错误是因为变量a未初始化。这与a将具有默认值 null 。
相矛盾我有另一个困惑,如果我运行下面的代码
import edu.princeton.cs.algs4.*;
public class test
{
public static void main(String[] args)
{
StdOut.println(null+"a");
StdOut.println("null"+"a");
}
}
两个代码行都打印 nulla 。那么字符串“null”等于 null 是真的吗?
有人可以帮我清除这两个问题吗?任何建议都有帮助。 THX。
答案 0 :(得分:4)
Book说如果我们在没有初始化的情况下声明一个引用类型的变量,那么该变量的默认值为null。
什么书?这是错的,如果它真的是这么说的话。该语句仅适用于静态和实例变量,而不适用于局部变量。必须在使用前显式初始化局部变量,并且编译器知道你没有这样做,并且给出了编译错误(而不是让程序以未定义的方式执行)。
字符串" null&#34>是真的吗?等于空?
String.valueOf(null)
确实等于"null"
。
答案 1 :(得分:1)
您在程序中执行的操作是错误的,就像您要创建局部变量一样,您必须使用某个值初始化它。如果JVM未初始化而不是局部变量,则由JVM将值分配给实例或静态类级别变量。 因此,如果您按如下方式编写代码:
a
这将为您提供null
作为输出,因为现在"null"
不是本地变量。
现在你的第二个问题:
String.valueOf
和public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString(); }
之间的关系 的java
如果我们查看null
"null"
由此我们可以很容易地看到,如果您尝试获取对象"nulla"
的值,它将返回一个非空且值为 $p = [diagnostics.process]::start("notepad.exe", "D:\temp\1mbfile.txt")
$p.WaitForInputIdle(5000);
的String。这就是为什么在两种方式中获得相同值的原因$p.HasExited -eq $true
我希望我的回答可以帮助你理解null。