4

Java のオーバーロードで理解できない動作があります。

これが私のコードです:

interface I {}

class A implements I {}

class B {
   public void test(I i) {}

   public void test (A a) {}
}

次の行を呼び出すと:

 I a = new A();
 b.test(a);

呼び出されたメソッドは だと思っていましたtest(A)が、目に見えてtest(I).

理由がわかりません。実行時に、私の変数aは A であっても A は I を継承します。

4

3 に答える 3

6

型 A のオブジェクトがあっても、参照型は I であるためです。

A a = 新しい A();

メソッドを呼び出しますtest (A a) {}

JLS第15章によると:

最も具体的な方法はコンパイル時に選択されます。その記述子は、実行時に実際に実行されるメソッドを決定します。

于 2012-08-23T14:40:30.073 に答える
3

変数aはタイプIですA a = new A();。使用する場合は、正しいオーバーロードされたメソッドを使用します。

于 2012-08-23T14:41:22.370 に答える
0

次のシナリオを検討してください。

    interface Animal { }

    class Dog implements Animal{ public void dogMethod() {} }

    class Cat implements Animal{ public void catMethod() {} }

    public class Test {
        public static void test (Animal a) { System.out.println("Animal"); }

        public static void test (Dog d) { System.out.println("Dog"); }

        public static void test (Cat c) { System.out.println("Cat"); }

        public static void main(String[] args) {
            Animal a = new Cat();
            Animal d = new Dog();

            test(a);
        }
    }

test(a) が Cat オブジェクトへの参照を保持しているという理由だけで (正しく) "Animal" ではなく "Cat" を出力した場合、Animal オブジェクトで catMethod() を呼び出すことができますが、これは意味がありません。Java は、変数が参照するものではなく、型に基づいて最も適切なメソッドを選択します。

于 2012-08-23T15:13:56.463 に答える