Java Class файл и метод привязки - PullRequest
0 голосов
/ 05 июля 2018
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 присутствует в родительском классе. Что здесь происходит?

1 Ответ

0 голосов
/ 05 июля 2018

Базовые классы могут меняться без перекомпиляции подкласса.

Чтобы выполнить метод, не имеет значения, где run() объявлено во время выполнения, пока существует такой унаследованный метод. (Если нет, вы получите NoSuchMethodError)

Если бы компилятор определил # 17 как Bike.run(), код слишком сильно зависел бы от класса Bike.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...