Когда создается объект, фактически создаются только нестатические данные вместе со ссылкой на тип объекта, который их создал.
Ни один из методов никогда не копируется.
«Ссылка» на класс, который его создал, на самом деле является таблицей отправки указателей. Один указатель существует для каждого метода, который доступен классу. Указатели всегда указывают на «правильную» (обычно самую низкую / наиболее конкретную в дереве объектов) реализацию метода.
Таким образом, если у вас есть вызов верхнего уровня для другого метода, но другой метод был переопределен, будет вызван переопределенный метод, потому что именно на него указывает указатель в таблице. Благодаря такому механизму вызов переопределенного метода не должен занимать больше времени, чем метод верхнего уровня.
Таблица указателей + переменные-члены являются «экземпляром» класса.
Переменная проблема связана с совершенно другим механизмом, "пространства имен". Переменные вообще не являются «подклассами» (они не входят в таблицу диспетчеризации), но публичные или защищенные переменные могут быть скрыты локальными переменными. Все это делается компилятором во время компиляции и не имеет ничего общего с вашими экземплярами объекта времени выполнения. Компилятор определяет, какой объект вам действительно нужен, и вставляет ссылку на него в ваш код.
Правила области видимости, как правило, в пользу "ближайшей" переменной. Все, что находится под тем же именем, будет просто проигнорировано (затенено) в пользу более близкого определения.
Чтобы получить более конкретную информацию о распределении памяти, если вам интересно: все «ОБЪЕКТЫ» размещены в «куче» (на самом деле нечто удивительно более эффективное и красивое, чем настоящая куча, но та же концепция.) Переменные всегда указатели --Java никогда не будет копировать объект, вы всегда копируете указатель на этот объект. Распределение указателей переменных для параметров метода и локальных переменных выполняется в стеке, но даже если переменная (указатель) создается в стеке, объекты, на которые они указывают, по-прежнему никогда не размещаются в стеке.
Мне хочется написать пример, но это уже слишком долго. Если вы хотите, чтобы я напечатал пару классов с отношением extends и как их методы и данные влияют на сгенерированный код, я могу ... просто спросить.