Отношения в классах Java OTUS

При работе с классами и объектами в Джаве иногда возникают некоторые трудности. Несмотря на это, логика в объектно-ориентированном программировании достаточно простая. Она гласит о правилах и отношениях между классами и иными компонентами кода.

В данной статье будет рассказано о том, что собой представляет агрегация и композиция. О наследовании тоже нельзя забывать. Все это – «база», без которой создать качественное приложение не получится.

Класс и объект – понятия

В Google полно информации о том, как грамотно подойти к изучению Джавы. Но перед углубленным изучением языка требуется изучить базовые понятия и определения.

Ни одна программа немыслима без классов, а также objects. Class в Java – это своеобразный шаблон, который помогает создавать объекты. Объект выступает в виде экземпляра класса. Такие определения выдает Google.

Также стоит отметить, что:

  1. В Java class помогает определять структуру и поведение, совместно использующиеся относительно набора objects.
  2. В классе, согласно Google, содержатся переменные и методы. Это – элементы или члены.
  3. Class – база инкапсуляции в Джаве.
  4. У каждого объекта, заданного class, есть структура и поведение, определенные классом заранее.

При работе с этими компонентами будущего приложения необходимо использовать методы. Они помогают описывать то, что объект способен делать. Иногда – какие операции и манипуляции с ним разрешено выполнять. Переменные здесь описывают свойства и характеристики objects.

Создание

Вот так, согласно Google, можно создать класс в Java:

После ключевого слова class принято прописывать его имя. Далее в кавычках указываются переменные и методы. Их конкретное количество не определено.

А вот еще один пример – описание public class для объекта Box. Example предусматривает три ключевые характеристики: ширину, высоту, глубину. Они описаны через переменные:

В случае с objects требуется воспользоваться таким оператором:

Google указывает на то, что при создании соответствующего элемента процедура проходит в несколько этапов:

  1. Сначала осуществляется объявление переменной типа класса. Она не будет определять object. Google указывает, что это необходимо для установки переменной, которая умеет ссылаться на объект.
  2. Далее происходит непосредственное создание ранее упомянутого компонента кода. Через оператор new динамически будет зарезервирована память для object, после чего произведется возврат ссылки на него.

После объявления объекта класса Box все переменные класса, по Google, получат значение по умолчанию для заданного типа информации. Для обращения к переменным и дальнейшей работы с ними применяется имя переменной object:

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

Ассоциации

Ассоциация – когда объекты двух классов ссылаются друг на друга. Они имеют между собой своеобразную связь. Пример – работник может выписать счет. Это влечет за собой ассоциацию между «участниками процесса». Еще один наглядный пример – преподаватели и студенты. Какой-то студент будет учиться у определенного преподавателя.

Ассоциация по Google – это описание связи между двумя определенными objects. Концепция здесь простая: есть объекты, которые могут быть связаны между собой. И эти связи требуется как-то описывать.

Aggregation и composition

Агрегация и композиция, если верить Google – это частный случай ассоциации. Представлены конкретизированными отношениями между objects в имеющемся исходном коде.

Тут стоит запомнить следующее:

  1. Агрегация – отношение, когда один объект выступает в качестве части другого. Пример – ученик входит в группу любителей химии.
  2. Композиция – более жесткий вариант. Object здесь не только относится к другому “похожему компоненту», но и не может иметь отношение к другим. Пример – машина и двигатель. Второй элемент способен выступать без автомобиля, но он не сможет находиться одновременно в нескольких транспортных средствах. А студенты способны посещать различные группы по интересам одновременно.

Все это – условное описание, которое дает Google. Но за счет него даже новичок сможет достаточно быстро разобраться, с чем ему предстоит иметь дело.

Примеры кодов

Чтобы позиции относительно рассматриваемого направления были быстро поняты, лучше рассмотреть наглядные примеры. Их очень много в Google. Почти все они выступают в качестве тривиальных.

Примеры основываются на следующих принципах:

  1. В пределах одного класса создается ссылка на другой и наоборот. Второй вариант встречается не всегда.
  2. Осуществляется развитие заданной идеи в зависимости от имеющихся связей. У машины 4 колеса, она будет со всеми связана. Это значит, что авто имеет ссылку на список колес (или так называемый массив).
  3. В примере нужно соединить робота с оператором его управления. Для этого используется не агрегирование, а ассоциации через ссылки в одном классе на другой.
  4. Robot будет иметь ссылку на класс Operator. Обратный вариант тоже присутствует.

Так описывается Robot:

А вот – Operator:

Допустимо создавать ссылки только в одном классе. Тогда связи односторонние. А можно ссылаться на массив или список, но ключевая концепция не меняется.

Наследование

Еще один вариант отношений – это ключевая концепция ООП. Речь идет о наследовании. Оно представляет собой своеобразный механизм при помощи которого удается описывать новые классы на основе уже существующего (родителя). Свойства и функциональность родительского класса, по Google, будут заимствованы «наследником».

Здесь стоит запомнить следующие данные:

  1. Если у дочернего класса есть уникальные свойства, поля спокойно объявляются внутри него.
  2. Главное преимущество наследование – возможность повторного использования программного кода.
  3. Множественное наследование в Джаве отсутствует. Класс наследуется только от одного «родителя».

В Google можно обнаружить немало туториалов и примеров, которые лучше всего объясняют соответствующую особенность.

Особое взаимодействие

Стоит обратить внимание на еще один метод взаимодействия компонентов кода. Речь идет о ситуации, когда постоянная связь между objects отсутствует, но какие-то сведения требуется передать от одного к другому.

Для этого применяется передача object непосредственно в методе. Пример – робот имеет method, который принимает информацию от другой «машины»: координаты. Это требуется для перемещения первого.

Ситуация потребует создания метода, который в виде параметра обладает object класса Robot. Чтобы лучше понимать композицию и агрегацию, а также иные особенности программирования на Java, стоит посетить дистанционные компьютерные курсы. Они помогут без Google быстро освоить выбранное направление и набраться практического опыта.

Документация JDK 20 — Главная

  1. Главная
  2. Ява
  3. Java SE
  4. 20

Обзор

  • Прочтите меня
  • Примечания к выпуску
  • Что нового
  • Руководство по миграции
  • Загрузить JDK
  • Руководство по установке
  • Формат строки версии

Инструменты

  • Технические характеристики инструментов JDK
  • Руководство пользователя JShell
  • Руководство по JavaDoc
  • Руководство пользователя средства упаковки

Язык и библиотеки

  • Обновления языка
  • Основные библиотеки
  • HTTP-клиент JDK
  • Учебники по Java
  • Модульный JDK
  • Руководство программиста API бортового регистратора
  • Руководство по интернационализации

Технические характеристики

  • Документация API
  • Язык и ВМ
  • Имена стандартных алгоритмов безопасности Java
  • банок
  • Собственный интерфейс Java (JNI)
  • Инструментальный интерфейс JVM (JVM TI)
  • Сериализация
  • Проводной протокол отладки Java (JDWP)
  • Спецификация комментариев к документации для стандартного доклета
  • Прочие характеристики

Безопасность

  • Руководство по безопасному кодированию
  • Руководство по безопасности

Виртуальная машина HotSpot

  • Руководство по виртуальной машине Java
  • Настройка сборки мусора

Управление и устранение неполадок

  • Руководство по устранению неполадок
  • Руководство по мониторингу и управлению
  • Руководство по JMX

Client Technologies

  • Руководство по специальным возможностям Java

Поведение `i = i++` в Java – Кодер-отступник

Недавно я руководил лабораторией Java, и один из моих студентов спросил меня, почему их код не работает. Просматривая их решение, я заметил странную строку, которая гласила: i = i++ . До этого момента я никогда не видел подобного кода и, конечно же, никогда не пробовал его. Итак, я сделал то, что сделал бы любой хороший учитель, и отправился в Google, чтобы узнать больше.

Содержание

Циклы Java

Как человек, написавший небольшое количество учебных материалов по Java, я считаю себя как минимум знатоком языка. Однако, продолжая преподавать, я обнаружил, что студенты всегда придумывают творческие способы расширить язык.

Во время моей недавней попытки преподавания циклов я наткнулся на студенческое решение со следующим синтаксисом цикла while:

 int i = 0;
в то время как (я < 10) {
  я = я++;
} 

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

Чтобы помочь в этом сообщении, я люблю время от времени менять свой синтаксис. Например, я нередко делюсь решениями проблем с циклами, используя каждый раз другой синтаксис цикла. Иногда я использую цикл for, а иногда — цикл while. Если я чувствую себя хорошо, я могу даже показать по одному циклу. Время от времени я даже добавляю некоторую рекурсию, чтобы встряхнуть ситуацию, но вы никогда не застанете меня врасплох, используя цикл do while.

Во всяком случае, этот менталитет проявляется, когда я увеличиваю переменные. Например, я склонен учить i = i + 1 во-первых, потому что это сбивает с толку студентов, которые не поняли, что знак равенства на самом деле является оператором присваивания. Конечно, как только я думаю, что они поняли концепцию, я обычно прибегаю к сокращению вроде i++ и i += 1 .

К сожалению, мое стремление к самовыражению иногда может привести к искажению синтаксиса, например:

 int i = 0;
в то время как (я < 10) {
  // Сделай что-нибудь
  я++;
} еще {
  // Делаем что-то еще
} 

Каждый раз, когда я вижу что-то подобное, я чувствую, что приближаюсь на один шаг к преодолению проклятия знания. Введите: я = я ++ .

Операторы приращения Java

Как я уже упоминал, в Java существует множество способов увеличить переменную. Следующий список охватывает довольно много примеров, хотя некоторые из них глупы:

 i = i + 1;
я += 1;
я++;
++я;
я = я - -1;
я -= -1;
i = -(~i) 

Несмотря на все варианты выше, я никогда не думал попробовать i = i++ , но это имеет большой смысл. Ведь похоже мы увеличиваем переменную и сохраняем результат. Честно говоря, я немного озадачился, когда увидел его вживую в лаборатории.

Как оказалось, i = i++ работает не так, как ожидалось, и это связано с тем, как оценивается правая часть оператора присваивания. Поскольку i++ является постфиксным оператором, i увеличивается, но возвращается его старое значение. В результате i заменяет собой старое значение.

Если приведенное выше объяснение не очень хорошо, попробуйте взглянуть на следующий фрагмент кода, который воспроизводит поведение:

 int temp = i;
я++;
я = температура; 

Если бы мы использовали синтаксис i = i++ в цикле, у нас был бы бесконечный цикл с небольшим количеством возможностей для диагностики ошибки. К счастью, я был там, чтобы хотя бы осознать проблему. Понимал ли я на самом деле ошибку или нет, это отдельная проблема, но я уверен, что сэкономил этому студенту много времени. Теперь я надеюсь поделиться своими выводами с другими!

The Take Home

На этом этапе я начинаю замечать тенденцию:

  1. Студент пишет интересный код
  2. Это работает/не работает, к моему удивлению
  3. Я провожу некоторое время в недоумении
  4. Я пишу статью, чтобы обсудить свои выводы

Будь то борьба со сканером API или открытие новых способов игры в «Камень, ножницы, бумагу», я Должен сказать, что мне очень весело учиться у моих учеников. Я совершенно не могу дождаться, когда стану профессором.

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

В любом случае, еще раз спасибо, что нашли время поддержать мою работу.

Coding Tangents (статьи 38) — навигация по серии

Будучи учеником на протяжении всей жизни и стремящимся учителем, я обнаружил, что не все предметы имеют одинаковое значение. В результате некоторые темы могут остаться незамеченными из-за нехватки времени или других обязательств. Лично я нахожу эти потерянные артефакты довольно забавными для обсуждения. Вот почему я решил запустить целую серию, чтобы сделать именно это. Добро пожаловать в Coding Tangents, сборник статей, посвященных граничным темам разработки программного обеспечения.

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