20

これは私の前の質問の続きであり、この質問の回答に基づいていますラッパークラスの宣言

Javaはプリミティブデータ型をラッパークラスにラップし、なぜ

char c = null; // invalid
int i = null; // invalid

は許可されていませんが、

Character cObj = null; // valid
Integer iObj = null; // valid

許可されています。

4

7 に答える 7

39

プリミティブはを表し、オブジェクト変数は複雑なデータ オブジェクトへの参照(ポインターのようなもの) を表すためです。一般的なnull値はありません。これは「何も参照しない」または空の参照という特別なキーワードです。これは非常に専門的でない回答ですが、最も適切だと思います。

また、あなたの意見では、null の数値は何ですか? 0? -1? しかし、それらは有効な整数なので、他に何があるのでしょうか?

次の複雑な Java チュートリアルに慣れることを強くお勧めします。あなたが尋ねてきたすべての側面がそこで説明され、例でサポートされています.

于 2013-10-22T07:30:38.387 に答える
31

null「オブジェクトの欠如」を意味します。参照はオブジェクトを欠くことができますが、プリミティブはできません。

于 2013-10-22T07:30:48.830 に答える
3

Java プリミティブ型の変数は、参照によるストアの変数ではなく、値によるストアです。ラッパー クラスは基本的に他の Java オブジェクトと同様のオブジェクトですが、プリミティブ型をラップするだけである点が異なります。

于 2013-10-22T07:31:13.580 に答える
2

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

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

デフォルトでは、

   int a=0;

そしてそうではない

   int a=null;

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

于 2013-10-22T10:18:06.183 に答える
1

アンボクシング/オートボクシングを参照すると、コンパイラがプリミティブからオブジェクトへ、またはその逆への連続的な「キャスト」に夢中になるのを防ぐために採用する2つの方法のように想像する必要がありますが、それらは完璧ではありません.

Integer ラッパーが null の場合に除算を行うとどうなりますか? Java は参照されていないオブジェクトをボックス化解除できないため、0 による除算ではなく Null ポインター例外です。

したがって、プリミティブとオブジェクトに対して異なる init ルールを維持することは安全で論理的です。

于 2013-10-22T07:44:48.387 に答える
1

Character や Integer などのオブジェクトはポインターです。その変数の値であるバイトに格納されている実際の数値は、JVM のメモリの残りのメモリ内のアドレスを表します。したがって、その番号をどこにも行かないアドレスに設定することは可能であり、意味があります。これが null です。

ただし、int や char などのプリミティブには、数値 (整数または ASCII コード) として解釈される数値があり、メモリに格納できるのは数値だけであるため、「非数値」にする方法はありません。

于 2013-10-22T07:32:48.290 に答える