-1

ここでいくつか質問があります。

null1)メソッドから値を返そうとしましたが、このようなものです(TypeCastedオブジェクトに入った場合のみ):

 public static Object returns()
{
   return (Object)null ;
}

オブジェクトを保存しました:

 ...main()..{
 Object obj=  returns();
 ...}

私がチェックしたとき:

  if( obj.equals(obj))

投げたNullPointerException

しかし、

 if(null==null)
 System.out.println("works");

コンパイルされ、正しい出力が得られました。これには何か理由がありますか?

2)また、私が試したとき:

 public static Object returns()
{
  return (Object)void ;
}

くれましたSyntax Error。何か理由はありますか?

3) この動作はC/C++?または他のOO言語で異なることがありますか?

4

3 に答える 3

2

代わりに を使用する必要がequalsあります。呼び出しとは同じではないことに注意してください。参照を比較する一方、慣例によりを比較するメソッドです。null オブジェクトには値がないため、これには意味がありません。null====equals==equals

Void はどの言語でも値ではないため、何にもキャストできません (この場合はObject)。

C++ で NULL を返すには、ポインターを返す必要があります。返されたオブジェクトを比較するには、次のように入力する必要があります。

 if( *obj == *obj)

obj が NULL であるため、これも失敗します。私が知っているどの言語でも、比較する前に null を明示的にチェックする必要があります。

編集:あなたが試してみるものがうまくいくと少し考えてみてくださいruby

于 2013-01-22T14:51:29.613 に答える
1

1)

if(obj.equals(obj))

デフォルトのequals実装==が 2 つのオブジェクト (実際には 2 つの参照) が実際にメモリ内の同じオブジェクトを参照しているかどうかを確認するために使用するだけであることは事実ですが、それにもかかわらず、それはインスタンス メソッドの呼び出しであり、NullPointerExceptionif で失敗するはずです。を介して呼び出されnullます。

 if(null==null)

代わりに、インスタンスメソッドを呼び出していないため、アドレスを比較しているだけなので、問題はありません。

2)void何も返さない関数をマークするために使用される単なるキーワードです1 ; 返そうとしても意味がありません。null代わりに、オブジェクト参照を何も指していないものとしてマークします。これはまったく異なる概念です。

3) C++ にはデフォルトの「equals」メソッドがなく、オブジェクト モデル全体が値型に基づいているため(代わりに、Java では通常、オブジェクトへの参照を使用します)、正確な比較を行うことは困難です。2

C++ では、オブジェクト (または参照) は「有効な」オブジェクトであることが保証さNullPointerExceptionれている (= 割り当てられたスペースがあり、コンストラクターが実行されている) ため、オブジェクトに対してインスタンス メソッドを呼び出した場合と同等の仮定を取得する可能性はありません。 .

一方、 であるポインターを持つことは完全に可能NULLであり、そのような場合、何らかの方法で (*またはを介し​​て->)参照解除しようとすると、未定義の動作 (通常はクラッシュ) に陥ります

同等性チェックに関しては、オブジェクトの==演算子はデフォルトでは実装されていないため、オブジェクトの同等性を比較することは、クラスの実装者が実際にoperator==;のオーバーロードを記述した場合にのみ意味があります。ポインターに関しては、==演算子は言語自体によって提供され (オーバーライドすることはできません)、実際に 2 つのアドレスを比較します。


  1. C および C++ とは対照的に、voidは型 (特に「完了できない不完全な型」) と見なされますが、Java ではではありませんが、いくつかの点ではそのように見なすことができます。
  2. C にはクラスやメソッドはありません。Cオブジェクト指向言語ではありません。それでも、以下の説明のほとんどはstructとそのフィールドへのアクセスに適用されます。
  3. ただし...インスタンスメソッドがvirtualオブジェクトのフィールドを使用しておらず、使用していない場合(=thisポインターが逆参照されていない場合)、ほとんどの実装では、ポインターでインスタンスメソッドを呼び出すことで回避できNULLます。また、ポインターを「正式に逆参照」することで、「null 参照」を作成することを回避できます。これは、使用時に問題を引き起こす可能性があります。しかし、どちらの場合も、まだ定義されていない動作です。つまり、正しくありません。ただし、通常は予防チェックは実行されず、厳格なルールの適用よりもパフォーマンスが優先されます。
于 2013-01-22T14:53:18.610 に答える
0

(Object)nullnullは、存在しないため、メソッドを使用できないことを意味します。

構文エラーに関しては、Javaではvoid値ではなく型であるため、を返すことはできませんvoid

于 2013-01-22T14:55:04.187 に答える