Object
Java ではnullはありますか?
Null
(実際には特性)がありますnull
。
null instanceof Object
はfalseですが、をtypeof(null)
返します'object'
。その場合はオブジェクトですか?知るか。
Object
Java ではnullはありますか?
Null
(実際には特性)がありますnull
。
null instanceof Object
はfalseですが、をtypeof(null)
返します'object'
。その場合はオブジェクトですか?知るか。
回答:
nullがオブジェクトの場合、java.lang.Object
などのメソッドをサポートしますequals()
。ただし、これは当てはまりません。nullでメソッドを呼び出すと、結果はになりNullPointerException
ます。
そして、これはJava言語仕様がこのトピックに関して言わなければならないことです:
名前のない式nullのタイプである特別なnullタイプもあります。null型には名前がないため、null型の変数を宣言したり、null型にキャストしたりすることはできません。null参照は、null型の式の唯一の可能な値です。null参照は、常に任意の参照型にキャストできます。実際には、プログラマーはnull型 を無視して、nullが任意の参照型になることができる特殊なリテラルであると偽ることができます。
これは、 "null is special"に要約できると思います。
java.lang.Object
。実際には-はい。java.lang.Objectのサブクラスではないクラスを作成することはできませんが、より哲学的な観点から考えることはありませんでした
NullPointerException
は» null
オブジェクト«… について言及していますが、それから»nullポインター«…について話しても大丈夫でした
Java 仕様によれば、null
はオブジェクト変数に割り当てることができる型です(コメントに記載されている値として)。ただし、このタイプの変数をインスタンス化または作成することはできませんnull
。コンパイラーが提供するリテラルを使用する必要があります。
null
名前はの「インスタンス」でnull
明らかに、タイプ。
null
変数ではなく、リテラルです:JLS、3.10.7。Null Literal
null
は割り当て可能な型です ":1)null
(コード内)はnullリテラルであり、null型ではありません2)一般的にJavaの変数には型を割り当てることができません。JLS4.1を参照してください: " [... ]変数に格納できる2種類のデータ値[...]:プリミティブ値(§4.2)と参照値(§4.3) "リテラルを介して割り当てることができる のはnull参照ですnull
。...続き...
length
java.awt.geom.Point2D
いいえ、それはオブジェクトではありません。
Nullはオブジェクトの欠如です。
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も参照)。
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
ですか?それはinstanceof
not と呼ばれていsameorsubtypeof
ます。つまり、インスタンスのタイプを2つのタイプではなく1つのタイプと比較しています。現在null
は、「インスタンスはありません」という意味であり、インスタンスがない場合、インスタンスのタイプはありません。何も何も比較しないと、false
。
または、「より多くの」現実の例:
マイケルが要約すると、「nullは特別です」は確かです。
第4.1章「Java言語仕様の型と値の種類」で説明したように、nullは1つの値を持つ型であり、null参照(およびリテラルによって表されますnull
):
名前のない特殊なnull型である式の型もあります
null
。null型には名前がないため、null型の変数を宣言したり、null型にキャストしたりすることはできません。null参照は、null型の式の唯一の可能な値です。null参照は、常に任意の参照型にキャストできます。実際には、プログラマーはnull型を無視してnull
、それを参照型にすることができる特殊なリテラルにすぎないふりをすることができます。
ただし、Nullオブジェクトパターン(お勧めしません)について読むことをお勧めします。このパターンの詳細については、C2 WikiまたはWikipediaを参照してください。
いいえ、それがあったとしても、メソッドやフィールドがないため、それは役に立ちません。
いいえ、オブジェクトではありません。nullのinstanceof Objectは常にfalseを返すため、クラスごとに1つではなく、nullが1つしかないためです。
null instanceof <anytype>
も戻りfalse
ます。
Object foo = null;
System.out.println(foo.toString());
最初の行のショーnull
はtype Object
に割り当てることができますが、2番目の行はそれが確かにではなくObject
、最終的にはjava.lang.NullPointerException