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 对象的引用而打印“Cat”而不是(正确地)“Animal”,那么您将能够在 Animal 对象上调用 catMethod(),这没有任何意义。Java 根据类型而不是变量引用的内容来选择最适用的方法。

于 2012-08-23T15:13:56.463 回答