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");
}
}
}
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);
}
}
在运行时 instanceof 操作员是 true 如果关系表达式的值不是 null 引用可以被强制转换为referencetype而不引发 ClassCastException . 否则结果就是 false . 这意味着对于任何类型 E 以及 R ,对于任何 E o ,在哪里 o == null , o instanceof R 总是 false . “null”属于哪一组?
11条答案
按热度按时间7vhp5slm1#
java(tm)中为空
在c和c++中,“null”是头文件中定义的常量,其值如下:
或:
或:
取决于编译器和内存模型选项。严格来说,null不是c/c++本身的一部分。
在java(tm)中,“null”不是关键字,而是null类型的特殊文本。它可以转换为任何引用类型,但不能转换为任何基元类型,如int或boolean。空文本的值不一定为零。而且不可能强制转换为null类型或声明这种类型的变量。
iaqfqrcu2#
java中的null类似于c中的nullptr。
c程序:
java中的相同程序:
现在您从上面的代码中了解了java中的空值是什么吗?如果没有,那么我建议您学习c/c中的指针,这样您就会理解了。
注意,在c中,与c不同的是,nullptr是未定义的,但是使用null代替,这也可以在c中使用,但是在c中,nullptr比只使用null更可取,因为c中的null总是空的
lx0bsm1f3#
字节码表示
java 的
null
具有直接的jvm支持:使用三条指令来实现它:aconst_null
:例如,将变量设置为null
如在Object o = null;
ifnull
以及ifnonnull
:例如,将对象与null
如在if (o == null)
第6章“java虚拟机指令集”接着提到null
其他说明:它抛出一个NullPointerException
对他们中的许多人来说。2.4. "引用类型和值”也提到
null
一般而言:一个引用值也可以是特殊的null引用,对no对象的引用,在这里用null表示。空引用最初没有运行时类型,但可以强制转换为任何类型。引用类型的默认值为null。
b5lpy0ml4#
null
是特殊的价值,它不是任何事物的示例。显然,这是不可能的instanceof
什么都行。sbdsn5lh5#
什么是空值?
没什么。
null是任何事物的示例吗?
不,因为它什么都不是,它不可能是任何事物的示例。
null属于什么集合?
没有任何设置
它在记忆中是如何表现的?
如果一些参考点指向它,比如:
在堆内存中分配给新创建对象的一些空间。o将指向内存中指定的空间。
现在
o=null;
这意味着现在o将不会指向对象的内存空间。z0qdvdin6#
null不是任何类的示例。
但是,可以为任何(对象或数组)类型的变量指定null:
vd2z7a6w7#
null是任何事物的示例吗?
不,这就是为什么
null instanceof X
会回来的false
对于所有类X
. (不要被你能分配的事实所愚弄null
类型为对象类型的变量。严格地说,赋值涉及隐式类型转换;见下文。)“null”属于哪一组?
它是null类型的唯一成员,其中null类型的定义如下:
“还有一种特殊的null类型,即表达式null的类型,它没有名称。因为null类型没有名称,所以不可能声明null类型的变量或强制转换为null类型。空引用是空类型表达式的唯一可能值。空引用始终可以转换为任何引用类型。在实践中,程序员可以忽略null类型,而只是假装null只是一个特殊的文本,可以是任何引用类型
什么是空值?
见上文。在某些情况下,
null
用于表示“无对象”、“未知”或“不可用”,但这些含义是特定于应用程序的。它在记忆中是如何表现的?
这是特定于实现的,您将无法看到
null
在纯java程序中(但是null
在大多数java实现中(如果不是所有的话)表示为零机器地址/指针njthzxwz8#
null
是一个特殊值,它不是任何类的示例。以下程序对此进行了说明:zrfyljdw9#
不,这不是任何事物的示例,示例总是假的。
tvmytwxo10#
null关键字是一个表示null引用的文本,它不引用任何对象。null是引用类型变量的默认值。
也可以看看
null:java词汇表
fnvucqvd11#
null是任何事物的示例吗?
不,没有哪种类型
null
是一个instanceof
.15.20.2类型比较运算符instanceof
在运行时
instanceof
操作员是true
如果关系表达式的值不是null
引用可以被强制转换为referencetype而不引发ClassCastException
. 否则结果就是false
.这意味着对于任何类型
E
以及R
,对于任何E o
,在哪里o == null
,o instanceof R
总是false
.“null”属于哪一组?
jls 4.1类型和值的种类
还有一种特殊的null类型,即表达式的类型
null
,它没有名字。因为null类型没有名称,所以不可能声明null类型的变量或强制转换为null类型。这个null
引用是空类型表达式的唯一可能值。这个null
引用始终可以强制转换为任何引用类型。在实践中,程序员可以忽略null类型并假装null
只是一个特殊的文本,可以是任何引用类型。什么是空值?
正如上面引用的jls所说,在实践中,您可以简单地假设它“只是一个特殊的文本,可以是任何引用类型”。
在 java ,
null == null
(其他语言并不总是这样)。另请注意,根据合同,它也有这个特殊的属性(从java.lang.Object
):public boolean equals(Object obj)
对于任何非-null
参考值x
,x.equals(null)
应该return false
.它也是所有引用类型的默认值(对于包含它们的变量):
jls 4.12.5变量初始值
每个类变量、示例变量或数组组件在创建时都会使用默认值进行初始化:
对于所有引用类型,默认值为
null
.使用方法各不相同。您可以使用它来启用所谓的字段延迟初始化,即字段的初始值为
null
直到它被实际使用,用“真实”值代替(计算起来可能很昂贵)。还有其他用途。让我们举一个真实的例子
java.lang.System
:public static Console console()
返回:系统控制台(如果有),否则返回null
.这是一种非常常见的使用模式:
null
用于表示对象不存在。下面是另一个用法示例,这次来自
java.io.BufferedReader
:public String readLine() throws IOException
退货:aString
包含行的内容,不包括任何行终止字符,或null
如果已经到达流的末端。所以在这里,
readLine()
会回来的instanceof String
对于每一行,直到它最终返回null
表示结束。这允许您按如下方式处理每一行:我们可以设计api,使终止条件不依赖于
readLine()
返回null
,但我们可以看到,这种设计有使事情简洁的好处。请注意,空行没有问题,因为空行"" != null
.让我们再举一个例子,这次从
java.util.Map<K,V>
:V get(Object key)
返回指定键Map到的值,或null
如果此Map不包含键的Map。如果这张Map允许的话
null
值,然后返回null
不一定表示Map不包含键的Map;也有可能Map显式地将键Map到null
. 这个containsKey
手术可以用来区分这两种情况。在这里,我们开始了解如何使用
null
会使事情复杂化。第一条语句说如果密钥没有Map,null
已返回。第二条语句说即使键被Map,null
也可以退货。相反,
java.util.Hashtable
通过不允许null
关键和价值观;它V get(Object key)
,如果返回null
,明确表示键未Map。您可以通读其余的api并找到它们的位置和方式
null
已使用。请记住,它们并不总是最佳实践的例子。一般来说,
null
用作特殊值,表示:未初始化状态
终止条件
不存在的对象
未知值
它在记忆中是如何表现的?
在 java ?不关你的事。最好保持这样。
空是件好事吗?
这现在是主观的边缘。有人这么说
null
导致许多本可以避免的程序员错误。有人说,在一种语言,捕捉NullPointerException
像java一样,使用它是很好的,因为在程序员出错时会很快失败。有些人避免null
通过使用空对象模式等。这本身就是一个巨大的主题,所以最好作为另一个问题的答案来讨论。
最后,我将引用
null
他本人,c.a.r.hoare(因快速排序而出名):我称之为我的十亿美元的错误。这是人类的发明
null
1965年的参考文献。当时,我正在设计第一个面向对象语言(algolw)中引用的综合类型系统。我的目标是确保引用的所有使用都是绝对安全的,由编译器自动执行检查。但我还是忍不住要把null
引用,只是因为它很容易实现。这导致了无数的错误、漏洞和系统崩溃,在过去的四十年中,这些错误、漏洞和系统崩溃可能造成了数十亿美元的痛苦和损失。这个演示的视频更深入;这是推荐的手表。