Если 10 не статических классов наследуются от одного не статического класса, то при создании объекта каждого класса наследника выделяется, для каждого объкта выделяется память и под поля класса родителя? (т.е. 10 раз выделяется память на поля класса родителя)
Vanyok Belousov
3 уровень
Выделение памяти java
Комментарии (10)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Сергеев ВикторMaster
14 мая 2023, 03:45
под каждый объект созданный через new выделяется память для всех его атрибутов, независимо от количества родительских классов и количества других объектов наследников.
Каждому объекту свой кусок памяти, потому что каждый объект сам по себе. Существуют разные оптимизации, например строка при создании через методы типа substring не создает новый массив char/byte, но только за счет того, что она immutable.
По факту проще считать, что у каждого объекта своя область в памяти
0
it
14 мая 2023, 04:42
Виктор, то есть я не правильно понял спецификацию?
ниже мой комментарий...
0
Денис Java Developer
14 мая 2023, 09:23
А чем именно ваши ответы отличаются то? Что ты, что Виктор сказали что память выделяется под все поля класса, будь они родными или наследованными.
Ты же не будешь отрицать, что поле принадлежащее родителю принадлежит и наследнику? за редким исключением ты можешь более чем свободно им оперировать.
0
it
14 мая 2023, 11:48
я чего то подумал, что он имеет ввиду, что память выделяется каждый раз,
из за фразы -
"под каждый объект созданный через new выделяется память для всех его атрибутов"
0
Денис Java Developer
14 мая 2023, 11:57
Ну да, каждый раз, потому что каждый объект требует определённой памяти :)
Свойства которые не статик, они общие для класса или же индивидуальные для объекта, как думаешь? И если индивидуальные, их же надо где-то хранить?)
И да, что по твоему значит вот эта фраза из твоей цитаты?
Whenever a new class instance is created...
0
it
14 мая 2023, 12:09
думаю индивидуальные, если не статик.
получается так.
эм, в момент когда новый класс создался...
:D
то есть для статических полей выделяется один раз память,
а для нестатических выделяется при каждом создании объекта, я правильно понял?
0
Justinian Judge в Mega City One Master
14 мая 2023, 14:05
вопрос интересный, с одной стороны, если создается экземпляр класса наследника, у которого 9 родителей, каждый из которых наследует поле одно и то же, вроде логично, чтобы это поле выделялось только один раз.
Но как я понимаю, если есть родитель наверху иерархии, и у него будет поле superField и это поле наследуется всеми наследниками, то при выделнии памяти фактически оно будет резервироваться для каждого наследника, и когда мы создаем экземпляр 10-го колена наследника, в нем получается будет 10 штук этих полей (по общему правилу, не принимая различий между JVM ).
При этом с самими методами по идее другая ситуация.
В интересные дебри начинающие забираются порой )
0
Денис Java Developer
14 мая 2023, 14:50
эм, в момент когда новый класс создался...
Каждый раз, когда создаётся новый экземпляр класса (инстанс).
Статика она общая для класса, такая переменная существует в единственном виде, не статика уникальна для каждого экземпляра. Justinian рассмотрел вопрос с другой, любопытной стороны. Но я думаю что память таки выделяется один раз если свойство именно унаследованное, все таки JVM не лохи писали.... по идее. Но это достаточно легко проверить эмпирически, если интересно - поиграйся с классами родителями и полями, да померяй дисковое пространство занимаемое ими.
0
Сергеев ВикторMaster
14 мая 2023, 19:26
смотри, если рассуждать независимо от jvm
объект - это что-то одно, один дома, одна машина.
Странно было бы если бы у всех машин был бы 1 двигатель, один единственный на всех. Или окно, одно для всех домов в мире.
Нет, каждый объект сам по себе. Если бы родительские атрибуты делились между объектами, то поменяв имя одному человеку ты бы переименовал все человечество )
По поводу статических атрибутов, они тоже принадлежат объекту. Объекту типа class описывающему твой класс. Единственное, что делает статический атрибут единичным для всех, это то, что его загружает один класслоадер, но это все равно объект и статические атрибуты его. Если каким-то образом завести дополнительный загрузчик классов в jvm то в теории у тебя будет 2 объекта типа class и у каждого будет свой набор статических атрибутов (соответственно и память будет для каждого выделена)
+1
it
12 мая 2023, 12:10
Если я правильно понял тебя и спецификацию,
то память выделяется один раз,
подробнее ниже.
Whenever a new class instance is created,
memory space is allocated for it with room for all the instance variables
declared in the class type and all the instance variables declared
in each superclass of the class type,
including all the instance variables that may be hidden
раздел: 12.5. Creation of New Class Instances
docs.oracle
0