2

コードの行が再生されたときに何が起こるかを誰かが正確に知っているかどうかを知りたいです。

class Class{}

class Math extends Class{}

class UseClasses{
public static void main (String[]args)

{

   new Math();  //Line 8
   (Class)new Math();//     Line 9

}

「新しいキーワード」がヒープメモリ内のオブジェクトインスタンス作成者として機能することを完全に理解しています。ただし、前のコードでは、9行目でこのキーワードが異常に使用されていることがわかります(新規)。8行目は問題なくコンパイルできます。ただし、9行目では、コンテンツを他の参照に割り当てる必要があります。したがって、これは、キャストオペランドが存在するたびに、この場合は(Class)new Mathで、新しい参照(オブジェクトではなく参照を強調する)がインスタンス化されることを意味します。

このように機能しますか?そうでない場合は、8行目で正常にコンパイルされて9行目でエラーが発生する理由を説明していただけますか?(明らかに、そこに配置されないキャスト機能のためですが、なぜそうではありませんか?)

4

4 に答える 4

1

どちらの行もインスタンスを構築しMathます。この場合、Mathは のサブクラスであるためClass(これはちょっと変わっていますが、大丈夫です。私は一緒に遊んでいます)。

したがって、9 行目で(Class)new Math();は、JVM が特殊化されたインスタンスであるという事実を忘れて、汎用オブジェクトClassのように扱うように JVM に指示しています。Classこれは、基本的に次のことを意味します。

Class c = (Class)new Math();からMath継承されていないメソッドがあっClassた場合、 object でそれらを呼び出すことはできませんc

ただし、c実際にはまだ のインスタンスであることに注意してくださいMath

この例の要点はよくわかりませんが、通常、コードをオブジェクトの一般的な定義から外して動作させ、特定の実装について心配したくない場合にこれを行います。わかりません。例全体がばかげているようです。

于 2013-01-30T15:44:25.013 に答える
0

この特定のケースでは、単純に 9 行目で変数への代入が行われていないことが原因です。

于 2013-01-30T15:55:36.260 に答える