За следния код защо се отпечатва A, B? Бих очаквал да отпечата B, B. Също така, дали повикването на метода, извършено от JVM, се оценява динамично или статично?
public class Main {
class A {
}
class B extends A {
}
public void call(A a) {
System.out.println("I"m A");
}
public void call(B a) {
System.out.println("I"m B");
}
public static void main(String[] args) {
Main m = new Main();
m.runTest();
}
void runTest() {
A a = new B();
B b = new B();
call(a);
call(b);
}
}
Отговори:
14 за отговор № 1Определя се претоварването статично от съставителя. Замяната се прави по време на изпълнение, но това не е фактор тук.
Статичният тип на a
е A, така че първото извикване на метод е решено да call(A a)
.
3 за отговор № 2
Тъй като вашият обект е известен по своя тип A
в този момент методът с аргумент A
се извиква. Така че да, определено е статично.
Това е, за да се избегнат неясноти B
е също така A
- но и двата метода не могат да бъдат извиквани едновременно.
1 за отговор № 3
B
е подклас от A
, Тъй като вие създавате a B
, но го присвойте на променлива тип A
, всичко B
спецификата ще бъде "загубена", следователно call(a)
ще бъде изпратен до call(A, a)
и отпечатайте "A".