/ / Логика на Java метод за претоварване на повиквания - java, jvm, метод-претоварване

Java метода пренатоварване логика - Java, JVM, претоварване на метода

За следния код защо се отпечатва 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".