nullはオブジェクトですか?


119

ObjectJava ではnullはありますか?


41
いいえ、そうではありません。なぜこのような質問をするのか疑問に思う人のために、Rubyなど、nullが実際に他のオブジェクトと同じような言語があります。
JRL、

7
型に非常に細心の注意を払っているScalaには、単一のインスタンスを持つ型Null(実際には特性)がありますnull
Carl Smotricz、2009

1
@JRL:好奇心から、それがJRubyの動作にどのように影響するのか不思議に思っています...(確かに、そのレベルの実装については十分に詳しくありません。)
Benjamin Oakes

@JRLのコメントに追加するには-Rubyのおおまかなnullis nilに相当します。これはNilClassの
Eliot Sykes

または、JavaScript null instanceof Objectはfalseですが、をtypeof(null)返します'object'。その場合はオブジェクトですか?知るか。
Don Hatch、2016

回答:


166

nullがオブジェクトの場合、java.lang.Objectなどのメソッドをサポートしますequals()。ただし、これは当てはまりません。nullでメソッドを呼び出すと、結果はになりNullPointerExceptionます。

そして、これはJava言語仕様がこのトピックに関して言わなければならないことです:

名前のない式nullのタイプである特別なnullタイプもあります。null型には名前がないため、null型の変数を宣言したり、null型にキャストしたりすることはできません。null参照は、null型の式の唯一の可能な値です。null参照は、常に任意の参照型にキャストできます。実際には、プログラマーはnull型無視して、nullが任意の参照型になることができる特殊なリテラルであると偽ることができます。

これは、 "null is special"に要約できると思います。


1
したがって、Javaのオブジェクトは、それと等しいかサブクラスである場合にのみオブジェクトですjava.lang.Object。実際には-はい。java.lang.Objectのサブクラスではないクラスを作成することはできませんが、より哲学的な観点から考えることはありませんでした
Andreas Dolk

不思議なことに、すべての中で、APIドキュメントNullPointerExceptionは» nullオブジェクト«… について言及していますが、それから»nullポインター«…について話しても大丈夫でした
Lumi

あなたは言った: "null参照は常にどんな参照型にもキャストできる"。それで、オブジェクト参照(戻り)型のメソッドでnull(typecasted-if allowed)を返すことができますか?
スリチャクラダー14

1
@Srichakradhar:はい、できます!ここで質問するよりも、コードで試してみる方が簡単にわかります。
Michael Borgwardt 2014

1
「null参照は、null型の式の唯一の可能な値です。」仕様ドキュメントを読む時が来ました。:)
sofs1 2016年

32

Java 仕様によれば、nullはオブジェクト変数に割り当てることができる型です(コメントに記載されている値として)。ただし、このタイプの変数をインスタンス化または作成することはできませんnull。コンパイラーが提供するリテラルを使用する必要があります。


8
nullはタイプと値です。
ヨアヒムザウアー

5
null名前はの「インスタンス」でnull明らかに、タイプ。
ストレッジャー2009

null変数ではなく、リテラルです:JLS、3.10.7。Null Literal
Gerold Broser 2015年

Re " nullは割り当て可能な型です ":1)null(コード内)はnullリテラルであり、null型ではありません2)一般的にJavaの変数には型を割り当てることができません。JLS4.1を参照してください: " [... ]変数に格納できる2種類のデータ値[...]:プリミティブ値(§4.2)と参照値(§4.3) "リテラルを介して割り当てることができる のはnull参照ですnull。...続き...
Gerold Broser 2017

3)「オブジェクト変数」内のオブジェクトは、クラス変数と比較して、通常はタイプではなくライフタイムを参照します。タイプを参照する場合、それは通常、参照タイプの変数、または略して参照(タイプ)変数と呼ばれます。インスタンス/オブジェクト変数を公開するJava APIには4つのタイプがあることを知っています(複数ある場合があります):とそのサブクラスを持つ配列lengthjava.awt.geom.Point2D
Gerold Broser 2017



12

Nullはオブジェクトの欠如です。


ただし、null型はすべての参照型に割り当てることができます。
トム・ホーティン-タックライン09/12/12

「ヌル型」はありません。nullはプリミティブでない式の特定の値です(つまり、参照。Javaにも「参照型」はありません)。
Tommy McGuire

3
Tommy:JLS 4.1:「特別なnull型、つまり名前のない式nullの型もあります。」
ケン

@TommyMcGuire Re» Javaには「参照型」はありません « JLS 4.1を
Gerold Broser

12

JRLが書いた:

いいえ、ちがいます、 ...

多くの場合、それはあなたがそれをどこから見ているか、誰があなたがより信じているかによります。

JLSによれば、そうです。特に、質問を次のように言い換えると、「nullリテラルはタイプObjectですか?」になります。JLS 4.1に加えて上記のMichael Borgwardtが引用

JLS 3.10.7を参照してください。

nullリテラルは常にnull型です。

およびJLS 4.10

タイプTのサブタイプは、TがUのスーパータイプであるようなすべてのタイプUであり、ヌルタイプです

またはJLS 4.10.2

null型の直接のスーパータイプは、null型自体以外のすべての参照型です。

[私が強調する。]

Eclipse 2019-09のコンパイラによれば、それはそうではありません

true.toString();  // Cannot invoke toString() on the primitive type boolean
null.toString();  // Cannot invoke toString() on the primitive type null

OpenJDKs 12.0.1 javac よると、それは

true.toString();  // error: boolean cannot be dereferenced
null.toString();  // error: <null> cannot be dereferenced

山カッコが意味するところnullは、プリミティブ型以外のものです。そしてJLS 4.1によれば:

Javaプログラミング言語には、プリミティブ型(...)と参照型(...)の2種類の型があります。

それが一方でない場合は、もう一方です。


Claudiuはこう書いている:

nullはちょっと醜いです。

Au contraire、null綺麗です。代わりに、参照型変数のデフォルト値として何を提案しますか?任意のビットの組み合わせ?アクセス違反への歓迎、さらに悪いことに、ポインター地獄へようこそ!


ヨアヒムザウアーは書きました:

nullはタイプと値です。

nullと組み合わせて実際には3つの項目がありますJLS 3.10.7も参照)。

  1. (そうでなければ名前のない)null型
  2. null リテラル
  3. ヌル基準値。(通常、null値または単にnullと省略されます。)

(1)上記のJLS 4.10.2によると、null型ははインターフェースだけでなくクラスにも多重継承を使用する。私たち全員が知っていることは、アプリケーションプログラマーには不可能です。

(2)nullリテラルは、次のように定義されている変数と考えられます。

JVM_global final null_type null = new null_type();

JLS 3.9にも注意してください。

さまざまな文字シーケンスが、誤ってキーワードであると想定されることがあります。

  • nullはキーワードではなく、nullリテラルです(§3.10.7)。

について null instanceof <any type>

JLS 4.10.2を念頭に置いて(„ null型はすべての型のサブタイプです)null instanceof <any type>はに評価されるはずtrueですよね。一見、はい、しかしJLS 15.20.2は洞察の答えを与えます:

[...] 結果instanceofオペレータは、あるtrue値場合関係式が ありませんnull [...]。それ以外の場合の結果はfalseです。

[私が強調する。]

(アプリケーションプログラマーの観点から)より意味のあることを自問してください。

  • 与えるfalseので、参照表現が私たちにさらされるタイプでないことを示す、すなわち、それは私たちに有益な何かを参照していない示します

  • またはを与えるtrueことにより、式が特別な参照、null参照に評価され、存在するかどうかわからない、名前のない特別なnull型である「オブジェクト」を参照することは、私たちがnullリテラルを介して、多重継承を含む任意の型のサブタイプであり、とにかく無視されますか?より実用的な例も検討してください。

     class Car implements Vehicle {  
     ...
     Vehicle car = null;
     ...
     boolean b = car instanceof Car;  // True? There's not even an instance
     ...                              // which could be of type Car.

これは以下にもつながります:

のオブジェクトらしさinstanceofについて何かを言う適切な方法がないのはなぜnullですか?

それはinstanceofnot と呼ばれていsameorsubtypeofます。つまり、インスタンスのタイプを2つのタイプではなく1つのタイプと比較しています。現在nullは、「インスタンスはありません」という意味であり、インスタンスがない場合、インスタンスのタイプはありません。何も何も比較しないと、false

または、「より多くの」現実の例:

  • りんごの実物大の写真(=参照型)を»Big Apple«(=参照型名)が書かれています。
  • テーブルがあります(=ヒープ私の前に)があります。
  • テーブルにリンゴ(= instance)がある場合、コード(= reference、それに接続されて)があります。
  • このコードのもう一方の端を手に持っています(=参照変数)。
  • リンゴをコードに沿ってたどって、私の写真(= instanceof)と比較します
  • リンゴのサイズが写真と同じかそれより大きい場合は、「ビッグアップル」と表記します(= true)。
  • 小さい場合は、そうではありません(= false)。
  • テーブルにリンゴがない(= インスタンスがない)ため、コードが存在しない場合(= null)、書き込みも適用されません(= false)。なぜなら、どのリンゴも大きなリンゴではないのですか?いいえ、ちがいます。


マイケルが要約すると、「nullは特別です」は確かです。


2
アップルとヌル?訴訟を恐れていませんか?:)
ガーボルLipták

9

いいえ、それはクラスのインスタンスでもクラスでもありません。それは何にも言及していません。

編集:仕様を読んでいないため、上記は100%正確ではない可能性があります。


5

4.1章「Java言語仕様の型と値の種類」で説明したように、nullは1つの値を持つ型であり、null参照(およびリテラルによって表されますnull):

名前のない特殊なnull型である式の型もありますnull。null型には名前がないため、null型の変数を宣言したり、null型にキャストしたりすることはできません。null参照は、null型の式の唯一の可能な値です。null参照は、常に任意の参照型にキャストできます。実際には、プログラマーはnull型を無視してnull、それを参照型にすることができる特殊なリテラルにすぎないふりをすることができます。

ただし、Nullオブジェクトパターン(お勧めしません)について読むことをお勧めします。このパターンの詳細については、C2 WikiまたはWikipediaを参照してください。



4

いいえ、オブジェクトではありません。nullのinstanceof Objectは常にfalseを返すため、クラスごとに1つではなく、nullが1つしかないためです。


3
実際、null instanceof <anytype>も戻りfalseます。
ボンベ、

4

Java仕様によると、

参照型の値として使用できる特別なnullリテラルもあります。プリミティブ型の変数を除いて、nullは任意の変数に割り当てることができます。null値を使用して、その存在をテストする以外にできることはほとんどありません。したがって、nullは、一部のオブジェクトが使用できないことを示すマーカーとしてプログラムでよく使用されます。


4

Javaは参照を介してオブジェクトを処理します。NullはJavaのオブジェクト指向性の内訳です。オブジェクト指向レベルを下回るからです。いいえ、それはオブジェクトではなく、参照のVALUEです。そして、それはオブジェクトのパラダイムとは何の関係もありませんが、オブジェクトを可能にするJavaの配管に関係しています。


3

nullのインスタンス java.lang.Objectですか?番号。

nullはオブジェクトですか?「is」の定義に依存します。


2
Object foo = null;
System.out.println(foo.toString()); 

最初の行のショーnullはtype Objectに割り当てることができますが、2番目の行はそれが確かにではなくObject、最終的にはjava.lang.NullPointerException


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.