Вопрос

<Ол>
  • Когда объект создается в Java, что в действительности происходит в памяти?
  • Включены ли копии родительских конструкторов?
  • Почему скрытые элементы данных ведут себя иначе, чем переопределенные методы при приведении?
  • Я понимаю абстрактные объяснения, которые обычно даются для того, чтобы вы правильно использовали этот материал, но как JVM действительно это делает.

    Это было полезно?

    Решение

    Когда создается экземпляр объекта, фактически создаются только нестатические данные, а также ссылка на тип объекта, который его создал.

    Ни один из методов никогда не копируется.

    " Ссылка " к классу, который создал это на самом деле таблица диспетчеризации указателей. Один указатель существует для каждого метода, который доступен классу. Указатели всегда указывают на «правильно» (обычно самая низкая / самая специфичная в дереве объектов) реализация метода.

    Таким образом, если у вас есть вызов верхнего уровня для другого метода, но другой метод был переопределен, будет вызван переопределенный метод, потому что именно на него указывает указатель в таблице. Из-за этого механизма вызов переопределенного метода не должен занимать больше времени, чем метод верхнего уровня.

    Таблица указателей + переменные-члены являются " Экземпляром " класса.

    Проблема с переменной связана с совершенно другим механизмом, «пространства имен». Переменные не являются "подклассами" вообще (они не входят в таблицу диспетчеризации), но публичные или защищенные переменные могут быть скрыты локальными переменными. Все это делается компилятором во время компиляции и не имеет ничего общего с вашими экземплярами объекта времени выполнения. Компилятор определяет, какой объект вам действительно нужен, и вставляет ссылку на него в ваш код.

    Области применения обычно заключаются в том, чтобы отдавать предпочтение " Ближайшему " переменная. Все, что находится под тем же именем, будет просто проигнорировано (затенено) в пользу более близкого определения.

    Чтобы получить более конкретную информацию о распределении памяти, если вам интересно: все " OBJECTS " размещаются в «куче»; (На самом деле нечто удивительно более эффективное и красивое, чем настоящая куча, но та же концепция.) Переменные всегда являются указателями - Java никогда не будет копировать объект, вы всегда копируете указатель на этот объект. Распределение указателей переменных для параметров метода и локальных переменных выполняется в стеке, но даже если переменная (указатель) создается в стеке, объекты, на которые они указывают, по-прежнему никогда не размещаются в стеке.

    Мне хочется написать пример, но это уже слишком долго. Если вы хотите, чтобы я напечатал пару классов с отношением extends и как их методы и данные влияют на сгенерированный код, я могу ... просто спросить.

    Другие советы

    Я думаю, вы найдете это исчерпывающим примером:

    http://www.onjava.com /pub/a/onjava/2005/01/26/classloading.html

    <Ол>
  • Память выделяется из кучи для хранения всех переменных экземпляра и специфичных для реализации данных объекта и его суперклассов. Специфичные для реализации данные включают в себя указатели на данные классов и методов.

  • Переменные экземпляра объектов инициализируются в их значения по умолчанию.

  • Вызывается конструктор для самого производного класса. Первое, что делает конструктор, это вызывает конструктор для его верхнего регистра. Этот процесс продолжается до тех пор, пока не будет вызван конструктор для java.lang.Object, поскольку java.lang.Object является базовым классом для всех объектов в java.

  • Перед выполнением тела конструктора выполняются все инициализаторы переменных экземпляра и блоки инициализации. Затем выполняется конструктор. Таким образом, конструктор для базового класса завершается первым, а конструктор для самого производного класса завершается последним.

  • Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top