Java の null はオブジェクトでも型でもありません。これは単なる特別な値です。任意の参照型に割り当てることができ、null を任意の型に変換することもできます。 。
null キーワードの詳細説明
1. まず、null は public、static、final などのキーワードです。大文字と小文字が区別され、null を Null または NULL として記述することはできません。コンパイラはそれらを認識せず、エラーを報告します。
2. すべての基本型にデフォルト値があるのと同様に、たとえば、int のデフォルト値は 0、boolean のデフォルト値は false、参照型のデフォルト値は null です。デフォルト値として false を持つブール変数を作成するのと同じように、Java の参照変数にはデフォルト値として null があります。これはすべての変数に当てはまります。
メンバー変数、ローカル変数、インスタンス変数、静的変数など (初期化されていないローカル変数を使用すると、コンパイラによって警告されます)。この事実を実証するには、変数を作成し、その値を出力することで、この参照変数を観察できます。
無料のビデオ チュートリアルの推奨: java ビデオ
3. いくつかの誤解を解き明かしたいと思います. null はオブジェクトでも型でもありません。それは単なる特別な値です。これを任意の参照型に割り当てることも、null を任意の型に変換することもできます。次のコードを見てください:
String str = null; Integer i = null; Double d = null; String myStr = (String) null; Integer myI = (Integer) null; Double myD = (Double) null;
コンパイル時と実行時に、null が任意の参照型にキャストされることがわかります。実行時に null ポインタ例外をスローしません。
4. 参照変数には null を割り当てることができますが、int、double、float、boolean などの基本型変数には null を割り当てることはできません。コンパイラはエラーを報告します。
ご覧のとおり、基本型に直接 null を代入すると、コンパイル エラーが発生します。ただし、ラッパー クラス オブジェクトに null を割り当ててから、それぞれの基本型にオブジェクトを割り当てた場合、コンパイラはそれを報告しませんが、実行時に null ポインター例外が発生します。これは、Java の自動アンボックス化が原因で発生します。
5. null 値を含むラッパー クラスは、Java がボックス化を解除して基本データ型を生成するときに、null ポインター例外をスローします。一部のプログラマーは、オートボックス化によって null がそれぞれの基本型のデフォルト値 (int の場合は 0、boolean 型の場合は false など) に変換されると誤解しますが、これは正しくありません (以下に示すとおり):
Integer iAmNull = null; int i = iAmNull; // Remember - No Compilation Error
ただし、上記のコード スニペットを実行すると、メイン スレッドが null ポインタ例外をスローすることがコンソールに表示されます。このようなエラーの多くは、HashMap および Integer キー値を使用するときに発生します。次のコードを実行するとエラーが表示されます。
public class Test3 { public static void main(String args[]) throws InterruptedException { Map numberAndCount = new HashMap<>(); int[] numbers = {3, 5, 7,9, 11, 13, 17, 19, 2, 3, 5, 33, 12, 5}; for(int i : numbers){ int count = (int) numberAndCount.get(i);//NullPointerException numberAndCount.put(i, count++); } } } package test;import java.util.HashMap; import java.util.Map; public class Test3 { public static void main(String args[]) throws InterruptedException { Map numberAndCount = new HashMap<>(); Integer[] numbers = {3, 5, 7,9, 11, 13, 17, 19, 2, 3, 5, 33, 12, 5}; for(Integer i : numbers){ Integer count = (Integer) numberAndCount.get(i); numberAndCount.put(i, count++); // NullPointerException } } }
このコードは非常にシンプルでエラーがないようです。行うべきことは、配列内に数値が何回出現するかを調べることだけです。これは、Java 配列で重複を見つけるための一般的な手法です。開発者は最初に前の値を取得し、次に値を追加し、最後にその値をマップに戻します。
プログラマーは、put メソッドを呼び出すとき、最初の方法は int を変換して null ポインターを報告し、前に述べたことを確認することだと考えるかもしれません。 2 番目の方法では、オートボックス化はボックス化解除の問題を単独で処理しますが、数値にカウント値がない場合、get メソッドは 0 ではなく null を返すことを忘れます。これは、Integer のデフォルト値が 0 ではなく null であるためです。 null 値を int 変数に渡すと、オートボクシングは NullPointerException を返します。
6. null 値を持つ参照型変数が使用されている場合、instanceof 操作は false を返します
Integer iAmNull = null; if(iAmNull instanceof Integer){ System.out.println("iAmNull is instance of Integer"); }else{ System.out.println("iAmNull is NOT an instance of Integer"); }
これは、instanceof 操作の非常に重要な機能であり、チェックが非常に簡単になります型キャストです。それは機能します。
7. ご存知かもしれませんが、null 値を持つ参照型変数を使用するために非静的メソッドを呼び出すことはできません。 null ポインター例外がスローされますが、静的メソッドを使用して null 値を持つ参照型変数を使用できることはご存知ないかもしれません。静的メソッドは静的バインディングを使用するため、null ポインター例外はスローされません。以下は例です:
public class Testing { public static void main(String args[]){ Testing myObject = null; myObject.iAmStaticMethod(); myObject.iAmNonStaticMethod(); } private static void iAmStaticMethod(){ System.out.println("I am static method, can be called by null reference"); } private void iAmNonStaticMethod(){ System.out.println("I am NON static method, don't date to call me by null"); }
8. メソッドに null を渡すことができます。この時点で、メソッドは任意の参照型 (例: public void print(Object obj)
) を受け取ることができます。このように print を呼び出すことができます (null)。これはコンパイルの観点からは問題ありませんが、結果はメソッドに完全に依存します。この例の print メソッドのような Null セーフ メソッドは、NullPointerException をスローせず、単に正常に終了します。
ビジネス ロジックで許可されている場合は、null セーフなメソッドを使用することをお勧めします。
9. == または != 演算を使用して Null 値を比較できますが、他のアルゴリズムや論理演算 (「未満」または「より大きい」など) は使用できません。 Java では null==null は true を返します。
おすすめの関連記事とチュートリアル: Java の入門
以上がnullはJavaのオブジェクトですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。