web-dev-qa-db-ja.com

Javaでプリミティブデータ型を「null」にできないのはなぜですか?

intdoubleなどのプリミティブ型データを宣言すると、それらは0または0.0に初期化されます。なぜそれらをnullに設定できないのですか?

35
MBMJ

プリミティブ型は単なるデータです。一方、オブジェクトと呼ぶものは、データが保存されている場所への単なるポインタです。例えば:

Integer object = new Integer(3);
int number = 3;

この場合、objectは値が3である整数オブジェクトへのポインタです。つまり、変数オブジェクトが格納されているメモリ位置にあるのは、データが実際に存在する場所への参照だけです。です。一方、numberが格納されているメモリ位置には、値3が直接含まれています。

したがって、objectをnullに設定できますが、それは単にそのオブジェクトのデータがnullにある(つまり、割り当てられていない)ことを意味します。 intをnullに設定することはできません。言語はそれを値0として解釈するためです。

お役に立てば幸いです!

57
Miquel

Nullは参照であるため。また、プリミティブ型は参照型ではありません。オブジェクトのみが参照型です。

19
Polygnome

Javaのプリミティブデータ型はObjectsではありません。常にラッパークラスの1つを使用してObjectを持つことができます。8つのプリミティブデータ型のすべて対応するラッパーがあります:

  • バイト:Java.lang.Byte
  • 短い:Java.lang.Short
  • int:Java.lang.Integer
  • 長いです: Java.lang.Long
  • 浮く: Java.lang.Float
  • double:Java.lang.Double
  • ブール値:Java.lang.Boolean
  • char Java.lang.Character

構造全体に興味がある場合は、 ここ(Primitive Data Types) から始めることができます。

10
brimborium

それは言語標準が言っていることだからです。

nullを渡すことができるようにしたい場合は、 ラッパータイプ を使用する必要があります。 Integerの代わりにint

5

オブジェクトはプリミティブよりもオーバーヘッドが大きくなります。次のテストは、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プリミティブがありません。

3
Chris

それはオブジェクトではなくプリミティブ型だからです。 null値を使用する機能が必要な場合は、各タイプに対応するオブジェクトを使用できます(つまり、Doubleはdouble、LongはLong、Booleanはブールなど)。

3
duduamar

上記のすべての答えとともに、私もこの点を追加したいと思います。

プリミティブ型の場合、メモリサイズが固定されています。つまり、intの場合は4バイト、charの場合は2バイトです。また、メモリサイズが固定されていないため、nullはオブジェクトにのみ使用されます。

したがって、デフォルトでは、

   int a=0;

ではなく

   int a=null;

他のプリミティブ型と同じであるため、nullはオブジェクトにのみ使用され、プリミティブ型には使用されません。

1
Shoaib Chikate

まず、プリミティブとオブジェクト参照の違いは、プリミティブ変数が実際の値を格納するのに対して、オブジェクト参照変数は参照するオブジェクトのアドレスを格納しますが、この場合、オブジェクト参照では、アドレスがなければ「ヌル"。

プリミティブデータタイプのデフォルト値は、プリミティブデータタイプによって異なります。たとえば、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」に初期化します

1
Yel