Как наследование технической работы? - PullRequest
5 голосов
/ 03 марта 2011

Я собираюсь выступить с презентацией в моей компании (я стажер) о наследовании в Java.Я думаю, что я понял это, и я также знаю, как использовать это.Но одно не совсем так.Где хранятся методы в хранилище.И как объект узнает, где находятся методы?

Например:

У нас есть этот класс.

class Animal {
    private String desc1;
    protected String desc2;

    public void breath() {
    }

    public void eat() {
    }
}

и этот класс:

  class Dog extends Animal() {
        public void bark() {
        }
    }

Теперь мы создаем класс Object of the Dog:

Dog dog = new Dog ();

Итак, теперь мои вопросы: Классы загружаются в кучу.Таким образом, Dog и Animal находятся в куче. (РЕДАКТИРОВАТЬ: Это неправильно, классы не загружаются в кучу, смотрите ответы ниже.). Итак, допустим, мы делаем dog.bark().Как собака узнает, где находится метод коры в куче?Знает ли это, где класс собаки?Затем мы делаем dog.eat(): Итак, когда собака знает, где находится собака, знает ли собака, где находится животное, или собака знает, где находится животное?Я знаю, что у него есть адрес, который находится в куче.И как это, когда я перезаписать метод?Где это хранится?

спасибо за помощь.

Ответы [ 3 ]

8 голосов
/ 03 марта 2011

Прежде всего, это зависит от JVM, и в спецификации JLS или JVM нет требований по как эти проблемы должны быть решены, только , что они должны быть решены.

Как собака узнает, где находится метод лая в куче?

Обычно у вас есть то, что называется Таблица виртуальных методов или V-таблица для краткости. Вы можете думать об этом как об идентификаторах метода отображения таблиц (например, bark) для указателей на функции. То есть, если вы вызовете bark, ВМ изучит свою v-таблицу и вызовет метод, на который указывает bark. Когда вы расширяете класс и переопределяете метод, указатель метода просто заменяется на указатель на переопределяющую функцию.

Как собака узнает, где находится метод лая в куче? Знает ли это, где класс собаки?

Методы и классы не хранятся в куче в том же смысле, что и экземпляры. С чего бы это?

Возможно, у вас такое же заблуждение, как и у меня, когда я начинал с ОО-программирования. Я подумал, что если я создам 10 Dog, я получу 10 методов лая вместе с ним. Это не правда. То, что вы «получаете», когда создаете экземпляр объекта, в основном это переменные-члены и ссылка this. Затем вы можете увидеть ссылку this в качестве дополнительного аргумента, передаваемого при вызове нестатических методов.

3 голосов
/ 03 марта 2011

Нет, классы загружаются не в кучу (по крайней мере, не в кучу в Java), а в раздел памяти, называемый пространством PermGen.

Я не могу сказать вам точно, как Java хранит эту информацию, но я предполагаю, что это похоже на то, как это делает C ++ ( vtable ), поскольку обычно это делается в собственном коде JVM.

0 голосов
/ 03 марта 2011

Сначала любой объект, созданный в Java, имеет ссылку на класс где-нибудь в заголовке объекта.Связать «статический» (не переопределяемый, JIT знает, переопределен ли какой-либо метод, но какой-то подкласс) метод легко, и он может быть встроенным или просто вызовом определенной точки, где находится код.

Это намного большесложный, поскольку оптимизированный код вызывается со значениями, хранящимися в регистрах, в то время как спецификация java требует их в стеке.

Вызов методов переопределения выполняется несколькими способами:

  • Динамическая проверкаэкземпляр и диспетчеризация вызова, как в статическом примере, это один вызов сравнения / ветвления, намного быстрее, чем
  • встроенные кэши
  • или уже упомянутые вызовы v-таблицы.v-таблицы являются самыми медленными

Хотя понимание того, как код выполняется процессором и методы, вызываемые / встроенные и т. д., является обширной темой.Я предполагаю, что некоторые другие основные понятия отсутствуют.

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