class HelloWorld{
public static void main(String []args){
A j = new B();
B k = new B();
System.out.println(j.foo(k));
}
}
class A {
public int foo(A p) { return 1; }
}
class B extends A {
public int foo(A p) { return 2; }
public int foo(B p) { return 3; }
}
Таким образом, на выходе будет 2. Я не понимаю, как это так. Не будет ли объект j
рассматриваться как его скомпилированная форма: A
? Тем не менее, он выполняет класс B
версии foo
, используя параметр типа A
, хотя k
относится к классу B
как во время компиляции, так и во время выполнения. Почему это так?
foo(A p)
наB
, вы не можете вызыватьfoo(A p)
изA
для объекта, который имеет тип времени выполнения (или динамический) (B
(переменнаяj
имеет статический типA
и тип времени выполненияB
). Но поскольку вы обращаетесь кj
через статический типA
, вы можете вызывать только методы, определенные вA
, поэтомуfoo(B p)
недоступен.Вот почему вызываетсяfoo(A p)
классаB
. - person Turing85   schedule 22.10.2016A
теоретически был методfoo(B)
, я предполагаю, что он смог бы выбратьB
s версиюfoo(B)
? - person tsquared   schedule 22.10.2016