作者:天勤-科技 | 来源:互联网 | 2022-12-01 20:01
我想知道为什么第三个输出不是b.
这是我的代码:
public class SimpleTests {
public void func(A a) {
System.out.println("Hi A");
}
public void func(B b) {
System.out.println("Hi B");
}
public static void main(String[] args) {
A a = new A();
B b = new B();
A c = new B();
SimpleTests i = new SimpleTests();
i.func(a);
i.func(b);
i.func(c);
}
}
class A {}
class B extends A {}
这是输出:
Hi A
Hi B
Hi A
有人能告诉我为什么第三个输出是Hi A
,不是Hi B
.因为真实的c是B的一个实例.
1> SBylemans..:
你在使用多态进行重载时感到困惑.
使用多态,在创建类B的实例时,它是类A的子类,由类A对象引用,并覆盖类A的方法,调用该方法将执行类B的方法.
使用重载时,被调用的方法只知道参数声明的类型,而不是初始化.
public class A {
public void print() {
System.out.println("A");
}
}
public class B extends A {
@Override
public void print() {
System.out.println("B");
}
}
public class Main {
public static void main(String[] args) {
A a = new A();
B b = new B();
A otherB = new B();
a.print();
b.print();
otherB.print();
}
}
这将输出
A
B
B
2> khelwood..:
A
在编译时基于参数的引用类型()解析对重载方法的调用,而不是B
运行时的对象类型().您将变量声明为类型A
,因此将其视为类型A
.