52

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

4

8 に答える 8

75

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

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

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

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

それが役立つことを願っています!

于 2012-06-15T08:43:21.677 に答える
26

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

于 2012-06-15T08:44:51.310 に答える
14

Java のプリミティブ データ型はObjects ではないためです。ラッパー クラスの 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

全体の構造に興味がある場合は、ここから開始できます (プリミティブ データ型)

于 2012-06-15T08:44:29.817 に答える
10

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

パスできるようにしたい場合は、 .wrapの代わりにラッパー タイプnullを使用する必要があります。Integerint

于 2012-06-15T08:42:38.837 に答える
4

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

于 2015-07-15T03:33:29.867 に答える
4

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

于 2012-06-15T08:43:46.900 に答える
1

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

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

于 2016-04-07T22:54:32.147 に答える