int
やdouble
などのプリミティブ型データを宣言すると、それらは0
または0.0
に初期化されます。なぜそれらをnull
に設定できないのですか?
プリミティブ型は単なるデータです。一方、オブジェクトと呼ぶものは、データが保存されている場所への単なるポインタです。例えば:
Integer object = new Integer(3);
int number = 3;
この場合、object
は値が3である整数オブジェクトへのポインタです。つまり、変数オブジェクトが格納されているメモリ位置にあるのは、データが実際に存在する場所への参照だけです。です。一方、number
が格納されているメモリ位置には、値3が直接含まれています。
したがって、object
をnullに設定できますが、それは単にそのオブジェクトのデータがnullにある(つまり、割り当てられていない)ことを意味します。 intをnullに設定することはできません。言語はそれを値0として解釈するためです。
お役に立てば幸いです!
Nullは参照であるため。また、プリミティブ型は参照型ではありません。オブジェクトのみが参照型です。
Javaのプリミティブデータ型はObject
sではありません。常にラッパークラスの1つを使用してObject
を持つことができます。8つのプリミティブデータ型のすべて対応するラッパーがあります:
Java.lang.Byte
Java.lang.Short
Java.lang.Integer
Java.lang.Long
Java.lang.Float
Java.lang.Double
Java.lang.Boolean
Java.lang.Character
構造全体に興味がある場合は、 ここ(Primitive Data Types) から始めることができます。
それは言語標準が言っていることだからです。
null
を渡すことができるようにしたい場合は、 ラッパータイプ を使用する必要があります。 Integer
の代わりにint
。
オブジェクトはプリミティブよりもオーバーヘッドが大きくなります。次のテストは、intがIntegerよりも約10倍高速であることを示しています。
int n;
EtmPoint point1 = etmMonitor.createPoint("test:objects");
for (n = 0; n < 1000000; n++) {
Integer t = 0;
t = 10;
t = 11;
}
point1.collect();
EtmPoint point = etmMonitor.createPoint("test:primitives");
for (n = 0; n < 1000000; n++) {
int t = 0;
t = 10;
t = 11;
}
point.collect();
etmMonitor.render(new SimpleTextRenderer());
これが、.netがnullableプリミティブを実装した理由です。残念ながらJavaにはnullableプリミティブがありません。
それはオブジェクトではなくプリミティブ型だからです。 null値を使用する機能が必要な場合は、各タイプに対応するオブジェクトを使用できます(つまり、Doubleはdouble、LongはLong、Booleanはブールなど)。
上記のすべての答えとともに、私もこの点を追加したいと思います。
プリミティブ型の場合、メモリサイズが固定されています。つまり、intの場合は4バイト、charの場合は2バイトです。また、メモリサイズが固定されていないため、nullはオブジェクトにのみ使用されます。
したがって、デフォルトでは、
int a=0;
ではなく
int a=null;
他のプリミティブ型と同じであるため、nullはオブジェクトにのみ使用され、プリミティブ型には使用されません。
まず、プリミティブとオブジェクト参照の違いは、プリミティブ変数が実際の値を格納するのに対して、オブジェクト参照変数は参照するオブジェクトのアドレスを格納しますが、この場合、オブジェクト参照では、アドレスがなければ「ヌル"。
プリミティブデータタイプのデフォルト値は、プリミティブデータタイプによって異なります。たとえば、byte = 0、short = 0、int = 0、long = 0L、float = 0.0f、double = 0.0d、boolean = false、char = "\ u0000" 。
クラス型の変数を宣言するとき、それは参照データ型と呼ばれます。
例:
テストt1
テストt2
(オブジェクトラッパータイプ)
整数i
ロングl
オブジェクト参照のデフォルト値、Jvmは参照変数を「null」として初期化し、配列も「null」に初期化します