orのようなプリミティブ型データを宣言すると、 int
ordouble
に初期化され0
ます0.0
。に設定できないのはなぜnull
ですか?
8 に答える
プリミティブ型は単なるデータです。一方、私たちがオブジェクトと呼んでいるものは、データが保存されている場所への単なるポインターです。例えば:
Integer object = new Integer(3);
int number = 3;
この場合、object
は値がたまたま 3 である Integer オブジェクトへのポインタです。つまり、変数オブジェクトが格納されているメモリ位置では、データが実際にある場所への参照しかありません。number
一方、 が保存されているメモリ位置には、値 3 が直接含まれています。
そのため、 を null に設定できますがobject
、それは単にそのオブジェクトのデータが 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
全体の構造に興味がある場合は、ここから開始できます (プリミティブ データ型)。
それが言語標準が言っていることだからです。
パスできるようにしたい場合は、 .wrapの代わりにラッパー タイプ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 が null 許容プリミティブを実装した理由です。残念ながら、Java には null 許容プリミティブがありません。
オブジェクトではなくプリミティブ型だからです。null 値を使用する機能が必要な場合は、各型に対応するオブジェクトを使用できます (つまり、double には Double、long には Long、boolean には Boolean など)。
まず、プリミティブとオブジェクト参照の違いはプリミティブ変数が実際の値を格納することです。オブジェクト参照変数は参照するオブジェクトのアドレスを格納します。この場合、オブジェクト参照ではアドレスがない場合に渡されます」ヌル"。
プリミティブ データ型のデフォルト値は、プリミティブ データ型によって異なります。たとえば、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」に初期化します