Инстанцирование Java

Прежде всего, есть несколько проблем с вашей диаграммой:

  • Вместо направленных ассоциаций рекомендуется использовать точечную нотацию.
  • Навигация сомнительна. Исследовательская группа, вероятно, имеет одного профессора в качестве главы и любое количество связанных "WiMi".
  • Назвать ассоциации, как вы это сделали, немного бессмысленно. Скорее вы должны использовать роли (и, соответственно, точечную запись для определения собственных свойств).
  • Общая агрегация не имеет определенной семантики согласно спецификациям UML. Это не имело бы смысла, если бы оно было составным. Вероятно, это ассоциация (член имеет презентацию). Вероятно, это должен быть также ассоциативный класс, чтобы связать его с ResearchGroup. Я бы не знал, почему это вообще должно быть статичным (возможно, неправильно думать в соответствии с отсутствующим классом ассоциации для презентации).

Поскольку вы реализуете его в Python, кратности можно упростить.

  • 0..1 означает, что у вас есть простая переменная, которая может принимать None или значение (в Python проверка типов отсутствует).
  • 1 означает, что это не должно быть None.
  • * или n..m означает, что у вас есть массив (просто инициализируйте его с помощью []).
  • Статические переменные не определены в Python. Вы могли бы поместить их в глобальный охват как своего рода компромисс.
10
задан Gulzar Nazim 20 October 2008 в 22:19
поделиться

2 ответа

Когда объект инстанцируют, только нестатические данные на самом деле "Создаются", наряду со ссылкой на тип объекта, который создал его.

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

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

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

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

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

Правила обзора данных должны обычно способствовать "Ближайшей" переменной. Что-либо еще дальше с тем же именем будет просто проигнорировано (затененное) в пользу более близкого определения.

Для получения немного более конкретным относительно выделения памяти, если Вам интересно: все "ОБЪЕКТЫ" выделяются на "куче" (На самом деле что-то удивительно более эффективное и красивый, чем истинная "куча", но то же понятие.) Переменные всегда являются указателями - Java никогда не будет копировать объект, Вы всегда копируете указатель на тот объект. Переменные выделения указателя для параметров метода и локальных переменных сделаны на стеке, но даже при том, что переменная (указатель) создается на стеке, объекты, на которые они указывают, все еще никогда не выделяются на стеке.

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

17
ответ дан 3 December 2019 в 20:07
поделиться

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

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

2
ответ дан 3 December 2019 в 20:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: