在Java中使用接口重载方法

时间:2012-08-23 14:38:31

标签: java overloading

我有一种我不理解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。

3 个答案:

答案 0 :(得分:6)

因为引用类型是I,所以你有类型A的对象。

a a = new A();

将调用方法test (A a) {}

根据JLS第15章:

  

在编译时选择最具体的方法;它的描述符   确定在运行时实际执行的方法。

答案 1 :(得分:3)

变量a的类型为I - 如果您使用A a = new A();,则会使用正确的重载方法。

答案 2 :(得分: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根据类型而不是变量引用的类型选择最适用的方法。