null
とは何ですか?
null
は何かのインスタンスですか?
null
はどのセットに属していますか?
それはどのようにメモリに表現されていますか?
Nullは何かのインスタンスですか?
いいえ、null
がinstanceof
である型はありません。
instanceof
RelationalExpression: RelationalExpression instanceof ReferenceType
RelationalExpressionの値が
instanceof
ではなく、参照がReferenceTypeにキャストされる可能性がある場合、実行時にtrue
演算子の結果はnull
になります。ClassCastException
を上げずに。それ以外の場合、結果はfalse
です。
つまり、すべてのE
およびR
、任意のE o
、o == null
、o instanceof R
は常にfalse
です。
Nullはどのセットに属しますか?
特別なnull型、式
null
の型もあり、これは名前を持ちません。 null型には名前がないため、null型の変数を宣言したり、nullにキャストすることはできません。 タイプnull
参照は、null型の式で唯一可能な値です。null
参照は、いつでも任意の参照型にキャストできます。実際には、プログラマはnull型を無視して、単にnull
が任意の参照型の特殊なリテラルであることを単にふりをすることができます。
Nullとは何ですか?
上のJLSの引用が述べているように、実際には、それは単に「任意の参照型のものであり得る特別なリテラル」であると単に考えることができます。
Javaでは、null == null
(これは他の言語では必ずしもそうではありません)。契約により、この特別なプロパティもあります( Java.lang.Object
より)。
public boolean equals(Object obj)
_
null
以外の参照値x
については、x.equals(null)
はreturn false
にする必要があります。
すべての参照型でデフォルト値(それらを持つ変数の場合)でもあります。
- 各クラス変数、インスタンス変数、または配列コンポーネントは、作成時にデフォルト値で初期化されます。
- すべての参照型で、デフォルト値は
null
です。
使い方はさまざまです。これを使用して、いわゆるフィールドの遅延初期化を有効にすることができます。この場合、実際に使用されるまでフィールドの初期値はnull
になり、実際の値に置き換えられます。計算するのが高価かもしれません)。
他の用途もあります。 Java.lang.System
から実際の例を見てみましょう:
public static Console console()
戻り値:存在する場合はシステムコンソール、それ以外の場合は
null
。
これは非常に一般的な使用パターンです。null
は、オブジェクトが存在しないことを示すために使用されます。
これは Java.io.BufferedReader
からの使用例です。
public String readLine() throws IOException
戻り値:行終了文字を含まない行の内容を含む
String
、またはストリームの終わりに達した場合はnull
。
そのため、ここでは、最後を示すnull
が最終的に返されるまで、readLine()
は各行に対してinstanceof String
を返します。これにより、各行を次のように処理できます。
String line;
while ((line = reader.readLine()) != null) {
process(line);
}
終了条件がnull
を返すreadLine()
に依存しないようにAPIを設計できますが、この設計には物事を簡潔にする利点があることがわかります。空行は"" != null
なので、空行でも問題はありません。
Java.util.Map<K,V>
から別の例を見てみましょう。
V get(Object key)
指定されたキーがマッピングされている値を返します。このマップにキーのマッピングが含まれていない場合は
null
を返します。このマップで
null
の値が許可されている場合、戻り値null
は必ずしもマップにキーのマッピングが含まれていないことを示すわけではありません。マップが明示的にキーをnull
にマップすることも可能です。これら2つのケースを区別するためにcontainsKey
操作を使用することができます。
ここでは、null
を使用すると、状況が複雑になる可能性があることを確認します。最初のステートメントは、キーがマップされていない場合はnull
が返されることを示しています。 2番目のステートメントは、キーがマップされていてもnull
はもを返すことができると言っています。
対照的に、 Java.util.Hashtable
はnull
のキーと値を許可しないことで、物事を単純にします。そのV get(Object key)
は、null
を返す場合、そのキーがマップされていないことを明確に意味します。
残りのAPIを読み、null
がどこでどのように使用されているかを調べることができます。これらは常にベストプラクティスの例ではないことに注意してください。
一般的に言って、null
は特別な値として使われます。
それはどのようにメモリに表現されていますか?
Javaで?あなたの心配はありません。そしてそれはそのようにしておくのが一番です。
null
は良いことですか?これは今主観的な境界線です。 null
は避けることができた多くのプログラマーエラーを引き起こすと言う人もいます。 JavaのようにNullPointerException
をキャッチする言語では、プログラマーのエラーで失敗する可能性があるので、それを使用するのが良いと言う人もいます。 Nullオブジェクトパターン などを使ってnull
を避けている人もいます。
これはそれ自体が大きなトピックなので、別の質問への回答として議論するのが一番です。
私はnull
自身の発明者からの引用でこれを終わらせます C.A.R Hoare (quicksort名声の):
私はそれを私の億ドルの間違いと言います。それは1965年の
null
参照の発明でした。当時、私は最初の包括的な型システムを設計していました。オブジェクト指向言語(ALGOL W)での参照用。私の目標は、コンパイラが自動的にチェックを実行しながら、すべての参照の使用が絶対に安全であるようにすることです。しかし、私はnull
参照を入れるという誘惑に耐えることができませんでした。単純に実装するのが簡単だったからです。これにより、無数のエラー、脆弱性、およびシステムクラッシュが発生し、過去40年間でおそらく10億ドルもの痛みと損傷が発生しています。
このプレゼンテーションのビデオ より深くなります。それはお勧めの時計です。
Nullは何かのインスタンスですか?
いいえ、それでnull instanceof X
はすべてのクラスfalse
に対してX
を返すのです。 (型がオブジェクト型である変数にnull
を代入できるという事実にだまされてはいけません。厳密に言えば、代入は暗黙の型変換を含みます。下記参照)
Nullはどのセットに属しますか?
これはnull型の唯一のメンバーで、null型は次のように定義されています。
"名前のない特別なnull型、式nullの型もあります。null型には名前がないため、null型の変数を宣言することは不可能です。 null参照は、null型の式で唯一可能な値ですnull参照は常に任意の参照型にキャストできます実際には、プログラマはnull型を無視して、nullを偽装することができます。単なる特別なリテラルで、どの参照型でもかまいません。 "JLS 4.1
Nullとは何ですか?
上記を参照。いくつかの文脈では、null
は「オブジェクトなし」、「不明」、または「使用不可」を示すために使用されますが、これらの意味はアプリケーション固有のものです。
それはどのようにメモリに表現されていますか?
これは実装に固有のものであり、純粋なJavaプログラムではnull
の表現を見ることはできません。 (ただし、すべてのJava実装ではないにしても、ほとんどの場合、null
はゼロのマシンアドレス/ポインタとして表されます。)
nullとは何ですか?
それは何もないです。
nullは何かのインスタンスですか?
それは何もないとしていいえそれは何のインスタンスにすることはできません。
nullはどの集合に属しますか?
セットなし
それはどのようにメモリに表されますか?
いくつかの参照がそれを指すならば:
Object o=new Object();
ヒープメモリ内で、新しく作成されたオブジェクトに割り当てられたスペース。そしてoはメモリ内の割り当てられた空間を指します。
今o=null;
これは今oがオブジェクトのそのメモリ空間を指していないことを意味します。
いいえ、それは何のインスタンスではありません、instanceofは常にfalseになります。
JavaのNULL(tm)
CおよびC++では、 "NULL"はヘッダーファイルで定義された定数で、次のような値です。
0
または
0L
または
((void*)0)
コンパイラとメモリモデルのオプションによって異なります。 NULLは厳密にはC/C++自体の一部ではありません。
Java(tm)では、 "null"はキーワードではなく、null型の特別なリテラルです。任意の参照型にキャストできますが、intやbooleanなどの基本型にはキャストできません。 NULLリテラルは、必ずしも値ゼロを持ちません。そして、null型にキャストしたり、この型の変数を宣言することは不可能です。
Nullはどのクラスのインスタンスでもありません。
ただし、任意の(オブジェクトまたは配列)型の変数にnullを代入することができます。
// this is false
boolean nope = (null instanceof String);
// but you can still use it as a String
String x = null;
"abc".startsWith(null);
バイトコード表現
Javaのnull
は直接JVMをサポートしています。それを実装するために3つの命令が使用されます。
aconst_null
:例Object o = null;
のように変数をnull
に設定するifnull
およびifnonnull
:例if (o == null)
のようにオブジェクトをnull
と比較する第6章「Java仮想マシン命令セット」 そして、他の命令に対するnull
の影響について言及しています。それらの多くに対してNullPointerException
がスローされます。
2.4。「参照の型と値」 は総称でnull
にも言及しています。
参照値は、特別なnull参照、つまりオブジェクトがないことへの参照である場合もあります。これは、ここではnullと表示されます。 null参照は、最初は実行時型を持ちませんが、任意の型にキャストできます。参照型のデフォルト値はnullです。
null
は特別な値で、何のインスタンスでもありません。明らかな理由でそれはinstanceof
にはできません。
null
は、どのクラスのインスタンスでもない特別な値です。これは次のプログラムで説明されています。
public class X {
void f(Object o)
{
System.out.println(o instanceof String); // Output is "false"
}
public static void main(String[] args) {
new X().f(null);
}
}
javaのnullは、C++のnullptrに似ています。
C++でのプログラム
class Point
{
private:
int x;
int y;
public:
Point(int ix, int iy)
{
x = ix;
y = iy;
}
void print() { std::cout << '(' << x << ',' << y << ')'; }
};
int main()
{
Point* p = new Point(3,5);
if (p != nullptr)
{
p->print();
p = nullptr;
}
else
{
std::cout << "p is null" << std::endl;
}
return 0;
}
Javaの同じプログラム:
public class Point {
private int x;
private int y;
public Point(int ix, int iy) {
x = ix;
y = iy;
}
public void print() { System.out.print("(" + x + "," + y + ")"); }
}
class Program
{
public static void main(String[] args) {
Point p = new Point(3,5);
if (p != null)
{
p.print();
p = null;
}
else
{
System.out.println("p is null");
}
}
}
さて、あなたは上記のコードからJavaの何がnullであるかを理解しますか?そうでなければ、私はあなたがC/C++でポインタを学ぶことをお勧めしますそしてそれからあなたは理解するでしょう。
Cでは、C++とは異なり、nullptrは未定義ですが、代わりにNULLが使用されます。これはC++でも使用できますが、C++ではnullptrが常にポインタに関連しているためです。そのため、C++ではサフィックス "ptr"がWordの末尾に追加され、またすべての文字が小文字になりましたが、これはそれほど重要ではありません。
Javaでは、非プリミティブ型クラスのすべての変数は常にその型のオブジェクトへの参照または継承され、nullはnullクラスのオブジェクト参照ですが、nullポインタではありません。Javaではそのようなことはない代わりにオブジェクトが使用され、Javaのnullはクラスオブジェクト参照に関連しているため、 "nullref"または "nullrefobj"と呼ぶこともできますが、これは長いので、単に "null"と呼びます。
C++では、オプションメンバー/変数、つまり値を持たないメンバー/変数にポインターとnullptr値を使用できます。つまり、値がない場合はnullptrと同じになります。例えば使用されます。
すべての質問にJLSから正式に回答する短くて正確な回答:
3.10.7。ヌルリテラル
Null型には、nullリテラルnullで表される1つの値、null参照があります。これは、ASCII文字から形成されます。
NULLリテラルは常にNULL型です。
Nullに割り当てられている型の参照だけが割り当てられます。あなたは参照に値(オブジェクト)を割り当てません。このような割り当ては、JVMにどの程度の参照が必要で、どのメモリー領域に割り当てられるかに固有のものです。
Javaには、主に2つのタイプの型があります。基本と参照です。プリミティブ型として宣言された変数は値を格納します。参照型として宣言された変数は参照を格納します。
String x = null;
この場合、初期化ステートメントは変数 "x"を宣言します。 “ x”は文字列参照を格納します。これはnullです。まず、nullは有効なオブジェクトインスタンスではないため、割り当てられたメモリはありません。オブジェクト参照が現在オブジェクトを参照していないことを示す値です。
私の考えでは、Javaでnullを見る興味深い方法は、それを情報の欠如を意味するものではなく、単に任意の型の参照に割り当てることができるリテラル値と見なすことです。もしそれが情報の欠如を示していると考えるならば、a1 == a2がtrueであることは意味がありません(両方ともnullの値が割り当てられている場合)。どのオブジェクトを指しているべきかわからない)...ところで、null == nullはJavaでtrueを返します。 Javaの場合SQL:1999のようになると、null == nullはunknownを返します(SQL:1999のブール値は、true、false、unknownの3つの値を取りますが、実際には、unknownは実際のシステムではnullとして実装されます)... http://en.wikipedia.org/wiki/SQL