我有一种我不理解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。
答案 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根据类型而不是变量引用的类型选择最适用的方法。