forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Программирование (http://forum.boolean.name/forumdisplay.php?f=54)
-   -   Наследование (http://forum.boolean.name/showthread.php?t=7589)

Serg_Bloim 07.01.2009 19:44

Наследование
 
Дано:
три класса, один (ClassP) - корневой, два(ClassCh1 и ClassCh2) - наследуемые от первого.
создаю в мидлете массив типа ClassP с элементами классов всех трех обьяленных типов.
ClassP[] Elems = {new ClassP(), new ClassCh1(), new ClassCh2()};
тоесть в массиве типа ClassP создаются также елементы наследуемых классов ClassCh1 и ClassCh2.
Как и предпологалось(даже не знаю, почему я подумал, что это сработает) эта конструкция хорошо живет без сбоев. Без проблем можно обращаться к членам-данным и членам-функциям классов, но только тем, которые обьявлены еще в родительском классе, тоесть в ClassP.
1)Вопрос вот в чем: почему это работает и нет ли тут какой-то незаметной ошибки? Ведь я создаю массив для элементов типа ClassP, а помещаю туда также его наследников, которые, скорее всего, занимают больше памяти.
2)Что происходит если удалить такой масив, точнее если сборщик мусора его удалит, то он не оставит неочищенными куски памяти, которые ушли под новые члены-данные и члены-функции наследуемых классов?
3)Может надо в деструкторе самому удалять свои, невходящие в род.класс обьекты в классе-потомке или это лишнее?

Piligrim 07.01.2009 21:57

Ответ: Наследование
 
В яве все объекты являются указателями и память выделяется при конструировании, а конструктор знает сколько надо памяти под определенный класс. А при удалении, удаляется весь объект, т.е. здесь безразлично в каком он массиве находится.
А обращаться получится только к тем даным и методам, которые объявлены в родительском классе ведь система думает, что это объекты ClassP
А вот если привести (ClassCh1)Elems[1], то легко обратишься и к новым методам и полям.


Часовой пояс GMT +4, время: 13:46.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot