public class Bike {
void run() {
System.out.println("bike is running");
}
}
public class Honda extends Bike{
public static void main(String[] args) {
Honda h = new Honda();
h.run(); // output 'bike is running'
}
}
Я попытался увидеть файл класса для класса Honda, и ниже приведен байт-код для основного метода
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=2, args_size=1
0: new #1 // class newpackage/Honda
3: dup
4: invokespecial #16 // Method "<init>":()V
7: astore_1
8: aload_1
9: invokevirtual #17 // Method run:()V
12: return
В строке 9 указан метод, который нужно вызвать, и запись # 17 в пуле констант разрешается следующим образом
#17 = Methodref #1.#18 // newpackage/Honda.run:()V
#18 = NameAndType #19:#6 // run:()V
Я ожидал, что # 17 разрешит Bike.run, а не Honda.run, поскольку во время компиляции была доступна информация о том, что метод run присутствует в родительском классе.
Что здесь происходит?