0

この質問はばかげているように聞こえるかもしれませんが、頭の中で明確にする必要があります。

 class J_SuperClass { 



void mb_method() { 
     System.out.println("J_SuperClass::mb_method"); 
   } 
   static void mb_methodStatic() { 
      System.out.println("J_SuperClass::mb_methodStatic"); 
   } 
} 
public class J_Test extends J_SuperClass { 
   void mb_method() { 
     System.out.println("J_Test::mb_method"); 
   } 
   static void mb_methodStatic() { 
     System.out.println("J_Test::mb_methodStatic"); 
   } 
   public static void main(String[] args) { 
     J_SuperClass a = new J_Test(); 
     a.mb_method(); 
     a.mb_methodStatic(); 
     J_Test b = new J_Test(); 
     b.mb_method();
     b.mb_methodStatic(); 
   } 
}

出力は次のとおりです。

J_Test::mb_method 
J_SuperClass::mb_methodStatic 
J_Test::mb_method 
J_Test::mb_methodStatic

動的バインディングは実行時に発生し、静的バインディングはコンパイル時に発生することを知っています。また、動的バインディングの場合、オブジェクトの実際の型によって、呼び出されるメソッドが決まります。私の質問は、上記のコードでは、「静的」という言葉が静的バインディングを引き起こし、オブジェクトの DECLARED 型がどのメソッドが呼び出されるかを決定するということですか?

4

2 に答える 2

1

はい、静的メソッドの場合、ポリモーフィズムがないため (動的バインディングが必要)、静的という言葉は静的バインディングを決定します。メソッドは、そのクラスでその名前を持つ唯一のものであるため、型ではなく名前にバインドされます。静的であるため、どのオブジェクトにも関連していません。

于 2012-11-09T09:31:13.307 に答える
0

J_Test クラスを逆コンパイルしてみてください。そこに表示されます:

public static void main(String args[])
    {
        J_SuperClass a = new J_Test();
        a.mb_method();
        J_SuperClass.mb_methodStatic();
        J_Test b = new J_Test();
        b.mb_method();
        mb_methodStatic();
    }

そのため、スーパークラスの静的メソッドがバインドされています。

于 2012-11-09T09:38:12.983 に答える