参照変数ではなく、参照値です。参照型の変数は、値nullを持つことができます。(Java では、すべての変数は参照型またはプリミティブ型 ( 、、など) です。(まあ、ジェネリックについて話し始めると、型変数もあります。)int
char
float
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 言語仕様に別のルールがあります。