Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么不';t基元可为空_Java_C#_Null_Nullable - Fatal编程技术网

Java 为什么不';t基元可为空

Java 为什么不';t基元可为空,java,c#,null,nullable,Java,C#,Null,Nullable,我想知道为什么原语不能为null 今天我读书 null关键字是表示null引用的文本,该引用不引用任何对象。null是引用类型变量的默认值。普通值类型不能为null。但是,C#2.0引入了可空值类型。请参阅可空类型(C#编程指南) 所以我知道在C#中有像int?或者在Java中有Integer这样的可为空的原语,但是为什么int或bool等不能直接为空呢 这个问题不针对任何编程语言,但编程语言之间是否存在差异,为什么它们不允许原语为空?我试图用C++来解释它: 在C++中,整数、布尔、…直接分配

我想知道为什么原语不能为null

今天我读书

null关键字是表示null引用的文本,该引用不引用任何对象。null是引用类型变量的默认值。普通值类型不能为null。但是,C#2.0引入了可空值类型。请参阅可空类型(C#编程指南)

所以我知道在C#中有像
int?
或者在Java中有
Integer
这样的可为空的原语,但是为什么int或bool等不能直接为空呢


这个问题不针对任何编程语言,但编程语言之间是否存在差异,为什么它们不允许原语为空?

我试图用C++来解释它:

在C++中,整数、布尔、…直接分配给内存,因此如果创建整数变量,它只使用四字节的值。如果要创建一个可为空的整数变量,则必须创建一个指向存储该值的内存的指针,因此,如果指针为空(0x0),它将不指向任何内容。如果不为null,则指向整数的实际值

如果要添加两个整数,可以使用单个汇编指令,因为值可以直接传递给处理器


这可以转换成C#/Java的字节码。C#/Java虚拟机可以直接使用这些原语。所有其他变量都不能直接使用,它们必须由编译器“取消引用”。

因为它们不能保存空值,它们不是对象,只有对象可以保存空值它们有自己的默认值,例如:
char将“\u0000”作为其默认值,但如果要使用空值,则应使用Character类,该类是单个char实例的容器…:) 我希望这会对你有所帮助:)

正如你所引用的

null关键字是表示null引用的文本,该引用不引用任何对象。null是引用类型变量的默认值


与对象不同,基本体保存数据,而不是引用。由于原语没有机会在其中保存引用,
null对它们来说没有任何意义。

值类型是结构。它们只能保存值。例如c#中的Int存储1、2等等。我们不能通过创建对象来引用它们

当它被认为是字符串或任何类时…它们可以被引用。如果它为null,则表示不引用任何东西


最后,我想说值类型存储值,对象存储值的引用:)

null
不指向任何内容,因此它是一个(不存在的)引用。在Java中,
Object
是一种引用类型,因此对象类型值可以包含空值(例如
Integer
)。另一方面,原语是值类型而不是引用类型,因此它们不能为
null


Java之所以这样设计是出于性能考虑。使用引用比使用值更慢,占用内存更多。

因为诸如int、bool等类型都是值类型,它们必须在初始化后具有一些值

在C#中,如果像这样初始化int(不赋值):

默认情况下,赋值为0。变量必须具有特定的值

引用类型中,如字符串或对象实例:

string someString;
SomeClass someObject;

默认情况下,赋值为null

我认为OP意识到了这一点,他在问为什么这是因为性能关联。在C#中,空值是结构,而在Java中,包装类(整数)是引用类型。如果您不了解变量是什么,以及从CPU指令中提取C#语言有多高,这是一个好问题。
string someString;
SomeClass someObject;