3
public class A{
    public static int x = 1;
    public int m(A a, B b){
        return a.m(b, b) + x;
    }
}

public class B extends A {
    public int m(A a1, B a2){
        if(a1 == a2)
            return x;
        return super.m(a1,a2);
    }
}

これは、私が受けている科目の過去の試験の問題です。

public class Main{
    public static void main(String[] args){
        B b1 = new B(){int m(A a, A b){ return 10; }};
        System.out.println(b1.m(b1, b1));
    }
}

問題は、次の出力が何をするかです。1の答えは正解でしたが、その理由がよくわかりませんでした。

B オブジェクトの内部クラスは (A,A) であるためです。(A、B)であるため、スーパーメソッドmをオーバーライドできないと考えるのは正しいですか?2 つのメソッドのパラメーターが交換された場合、オーバーライドできますか?

オーバーライドもオーバーロードもできないため、何もせず、単に B クラスのメソッド m を使用しますか?

オブジェクトの内部クラスは、それ自体でのみ機能しますか? anonクラスのようなものですか?

すべての質問についてお詫び申し上げます。

前もって感謝します。

編集:

これまでの私の理解では、静的型が B に設定されているため、型 B は anon クラスを見ることができません。これが public に設定されていれば、見ることはできますが、それでも使用されません。

これは別の質問で私を混乱させました。

public class A{
    public static int x = 1;
    public int m(A a, B b){
        return a.m(b, b) + x;
    }
}

public class Main{
 public static void main(String[] args){
  A a1=new A();
  A a2=new A(){ 
   int m(A a,B b){
    return 10;
   }};
  B b1=new B();
  System.out.println(a1.m(a2,b1));
 }
}

次のように呼び出すと、出力は 11 になります。a1.m を呼び出すと、a2 と b1 が渡されます。

A クラスでは、am(b,b) が呼び出されたとき。動的タイプを呼び出します。一度パースすると動的型に変わるからでしょうか。では、anon クラスを使用できるようになりましたか?

4

4 に答える 4

1

みんなの答えの上に追加します。次の質問への回答、特にJLS (15.12.2.5 最も具体的な方法の選択) を指している質問への回答が適切である必要があります。

于 2013-06-12T02:35:18.413 に答える
1

ここにはいくつかのポイントがあります:

  • 匿名内部クラスのメソッドはパブリックではないため、パブリック メソッドをオーバーライドできません。@Override非抽象メソッドをオーバーライドする必要がある場合は、常に使用してください。
  • の (静的) 型はb1isBであるため、匿名型で宣言された追加のメソッドは使用できません。次のようなことができますが:

    B b1 = null;
    System.out.println(new B(){int m(B a, B b){ return 10; }.m(b1, b1));
    

または

    final B b1 = null;
    new B() {
        {
            System.out.println(this.m(b1, b1));
        }
        int m(B a, B b) { return 10; }
    };
  • 言語は、最も具体的なパラメーターではなく、最も具体的なパラメーター (存在する場合) を持つオーバーライドを選択します。前の例で修正されました。たとえば、System.err.println("donkey".toCharArray());を呼び出しませんprintln(Object)
  • オーバーライドされたメソッドは、戻り値の型、「共変の戻り値の型」を緩和できます (1.5 以降)。スーパータイプのジェネリック パラメーター型 (たとえば for Comparable) の場合、パラメーターに対してまったく同じことが起こるわけではありません。
于 2013-06-12T01:43:53.990 に答える