1

Patrick Naughton による「The Java Handbook」を読んでいます。

Book の説明: 変数の型をクラスとして宣言すると、デフォルト値がnull type の参照にObjectなるため、他のすべてのクラスと型互換性があります。nullオブジェクトには値がありません。ブール値の と同様に、整数 0 とは異なりfalseます。

強調表示された部分を理解/混乱させることはできません。それnullはタイプの変数であると言えObjectますか?

ページ番号: 107 パラ: 5

4

2 に答える 2

7

参照変数ではなく、参照値です。参照型の変数は、値nullを持つことができます。(Java では、すべての変数は参照型またはプリミティブ型 ( 、、など) です。(まあ、ジェネリックについて話し始めると、型変数もあります。)intcharfloat

Java 言語仕様の関連部分は次のとおりです。

Java プログラミング言語には、プリミティブ型 (§4.2) と参照型 (§4.3) の 2 種類の型があります。それに対応して、変数に格納でき、引数として渡され、メソッドによって返され、操作できるデータ値には、プリミティブ値 (§4.2) と参照値 (§4.3) の 2 種類があります。

名前のない特別な null 型、式 null の型 (§3.10.7、§15.8.1) もあります。

null 型には名前がないため、null 型の変数を宣言したり、null 型にキャストしたりすることはできません。

null 参照は、null 型の式の唯一の可能な値です。

null 参照は、常に任意の参照型への拡大参照変換を受けることができます。

実際には、プログラマーは null 型を無視して、null は任意の参照型にできる単なる特別なリテラルであると偽ることができます。

EDITあなたのコメントに対処するには: 「The Java Handbook」の言語は少し的外れだと思います。値nullは type の参照ではありませんObject。null 型の参照です。仕様の重要なポイントは、「null 参照は常に任意の参照型への拡大参照変換を行うことができる」ということです。これは、ある意味で とは正反対ですObject。参照は、最も広い種類のObject参照です。タイプはnull(少し大雑把に言えば)最も狭いです。特に、 type の参照をObject他の参照型の変数に代入することは、明示的なキャストを必要とする (および を発生させる可能性がある)縮小変換ですClassCastException。を割り当てるnull参照型の変数への参照は、キャストを必要とせず、例外を発生させることはできません。

名前付き参照型は null 型の動作を持つことができないことに注意してください。Javaの(名前付き)型システムにはそのようなものがないため、実際には「最も狭い型」はありません。Stringたとえば、変数と変数の両方に割り当て可能な参照型を定義することは不可能Doubleです。null 型のみがそのプロパティを持ちます。参照型変換の通常のルールではこれが許可されていないため、Java 言語仕様に別のルールがあります。

于 2012-11-17T23:45:22.253 に答える
1

JLSから:

null 型には 1 つの値 (null 参照) があり、ASCII 文字から形成される null リテラル null で表されます。

于 2012-11-17T23:47:34.183 に答える