То, что точно является клиентом класса

Я всегда думал, что клиент класса - это тот, который использует ссылку для доступа к экземплярам полей/методов этого класса, то есть другому классу (из его собственных методов). Но когда я думаю о некоторых деталях, есть некоторые вещи, которые я не мог понять.

В Java я знаю несколько мест, где вы можете размещать инструкции действий.

  • Внутри метода (экземпляр/статический)
  • Inline initialization (когда вы объявляете переменную экземпляра, как в private int x = 5;)
  • Статический блок

Возможно, есть больше, чего я не знаю или не помню.

Первая часть вопроса - все эти рассмотренные клиенты, если они находятся в другом классе? Также могут ли они получить доступ к частным вещам, когда они находятся в одном классе?

Вторая часть: Когда JVM вызывает метод (например, main и finalize), они также считаются клиентами? (вызовы не из класса?)

Изменить: Может ли клиент получать доступ только к общедоступным методам и переменным? Не можем ли мы назвать его клиентом, если он обращается к полям пакета (если в одном пакете).

Ответы

Ответ 1

Перед погружением в Java -леты попытаются сопоставить ситуацию с физическим мировым сценарием.

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

Термин клиент относится к любому объекту, который запрашивает службу у другого объекта. Клиент не беспокоится о том, как объект, предоставляющий услугу, фактически предоставляет услугу - клиент счастлив, пока услуга доступна и выполняет свой прецедент.

Следовательно, когда метод M1 внутри класса вызывает другой метод M2, тогда M1 является клиентом M2. Аналогично, если класс C1 запрашивает службу C2, то C1 является клиентом C2.

Переходя к вашему вопросу о main(), finalize() и взаимодействии с JVM. Вы можете рассматривать класс-загрузчик JVM как клиента вашего класс, поскольку он загружает загрузчик класса JVM, загрузит ваш класс, а затем запросит основной метод, чтобы начать выполнение и продолжить дальнейшую обработку. EDIT, основанный на комментарии метода OP - finalize(), доступен сборщиком мусора в JVM с использованием некоторых внутренних твитов JVM. Как правило, в любом обычном приложении такие трюки не будут выполняться.

Ответ 2

Я не верю, что существует строгое определение "клиент класса". Обычно я говорю "клиентский код", то есть один кусок кода, который использует другой фрагмент кода через какой-то контракт. С этой точки зрения даже JVM при вызове метода класса finalize может считаться кодом клиента для кода вашего класса, поскольку он работает с вашим классом через определенный интерфейс, определенный в классе Object (его finalize).

В любом случае, дело здесь не в том, как вы его называете, а в том, что вы из него делаете. Вызывает ли JVM клиент вашего класса что-то для вас или влияет на способ написания кода? Думаю, нет. Поэтому я предпочитаю говорить о понятии контракта (интерфейса) между двумя частями кода.

Ответ 3

... клиент класса - это тот, который использует ссылку на доступ... поля/методы этого класса

Исправить, но не ограничиваясь примерами

... все эти рассмотренные клиенты, если они находятся в другом классе?

Да методы и переменные являются клиентами какого-либо другого класса, если они ссылаются на него.

Обратите внимание: встроенная инициализация на самом деле является короткой рукой для инициализации в методе конструктора и статическими блоками для статического инициализатора.

могут [клиенты] получать доступ к частным материалам [из другого класса]?

Только если разрешает другой класс (например, возврат частного объекта из метода getter). То же самое касается защищенных материалов, если он не находится в одном пакете, сам JVM не подпадает под частные/защищенные ограничения.

Когда JVM вызывает метод (например, main и finalize), они также считаются клиентами? (вызовы не из класса?)

JVM или один из его компонентов считается клиентом в этом случае. Вызовы могут быть из класса в JVM в зависимости от реализации JVM.

Ответ 4

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

Ответ 5

Я не уверен, что в Java существует строгое определение "клиент". Фактически, я предпочел бы предложить этот термин только для интерфейсов, поскольку они обеспечивают инкапсуляцию и избегают статических вызовов. Поскольку существуют разные режимы доступа, которые применяются к методам и полям, тогда трудно предсказать и определить, какой именно вызов является "клиентом", а какой нет. Более того, возникает еще один вопрос: "Должен ли мы назвать дочерний класс" клиентом ", поскольку он может использовать родительские методы?"