1)
if(obj.equals(obj))
デフォルトのequals
実装==
が 2 つのオブジェクト (実際には 2 つの参照) が実際にメモリ内の同じオブジェクトを参照しているかどうかを確認するために使用するだけであることは事実ですが、それにもかかわらず、それはインスタンス メソッドの呼び出しであり、NullPointerException
if で失敗するはずです。を介して呼び出されnull
ます。
if(null==null)
代わりに、インスタンスメソッドを呼び出していないため、アドレスを比較しているだけなので、問題はありません。
2)void
何も返さない関数をマークするために使用される単なるキーワードです1 ; 返そうとしても意味がありません。null
代わりに、オブジェクト参照を何も指していないものとしてマークします。これはまったく異なる概念です。
3) C++ にはデフォルトの「equals」メソッドがなく、オブジェクト モデル全体が値型に基づいているため(代わりに、Java では通常、オブジェクトへの参照を使用します)、正確な比較を行うことは困難です。2
C++ では、オブジェクト (または参照) は「有効な」オブジェクトであることが保証さNullPointerException
れている (= 割り当てられたスペースがあり、コンストラクターが実行されている) ため、オブジェクトに対してインスタンス メソッドを呼び出した場合と同等の仮定を取得する可能性はありません。 .
一方、 であるポインターを持つことは完全に可能NULL
であり、そのような場合、何らかの方法で (*
またはを介して->
)参照解除しようとすると、未定義の動作 (通常はクラッシュ) に陥ります。
同等性チェックに関しては、オブジェクトの==
演算子はデフォルトでは実装されていないため、オブジェクトの同等性を比較することは、クラスの実装者が実際にoperator==
;のオーバーロードを記述した場合にのみ意味があります。ポインターに関しては、==
演算子は言語自体によって提供され (オーバーライドすることはできません)、実際に 2 つのアドレスを比較します。
- C および C++ とは対照的に、
void
は型 (特に「完了できない不完全な型」) と見なされますが、Java ではではありませんが、いくつかの点ではそのように見なすことができます。
- C にはクラスやメソッドはありません。Cはオブジェクト指向言語ではありません。それでも、以下の説明のほとんどは
struct
とそのフィールドへのアクセスに適用されます。
- ただし...インスタンスメソッドが
virtual
オブジェクトのフィールドを使用しておらず、使用していない場合(=this
ポインターが逆参照されていない場合)、ほとんどの実装では、ポインターでインスタンスメソッドを呼び出すことで回避できNULL
ます。また、ポインターを「正式に逆参照」することで、「null 参照」を作成することを回避できます。これは、使用時に問題を引き起こす可能性があります。しかし、どちらの場合も、まだ定義されていない動作です。つまり、正しくありません。ただし、通常は予防チェックは実行されず、厳格なルールの適用よりもパフォーマンスが優先されます。