Java 为什么不';t基元可为空
我想知道为什么原语不能为null 今天我读书 null关键字是表示null引用的文本,该引用不引用任何对象。null是引用类型变量的默认值。普通值类型不能为null。但是,C#2.0引入了可空值类型。请参阅可空类型(C#编程指南) 所以我知道在C#中有像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++中,整数、布尔、…直接分配
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;