Как связать два класса java

Обновлено: 18.04.2024

Привет,помогите разобраться с связью классов,было задание про составление файла с результатами ведомости,мне помогли с заданием тут => Запись в файл результатов сессии,и работа с ними но я запутался и не смог разобраться как мне связать между собой два класса.Пытался найти информацию в интернета,ничего из найденного не помогло,подскажите как их можно связать между собой?
Класс Student:

Как связать два класса
Здравствуйте , я начинающий в джаве , подскажите как правильно и как лучше реализовать данную.

Имеются два числа long, как их сравнить между собой?
привет всем. прошу не ругаться. Но есть вопрос. имеются два числа long. как их сравнить между.

Как связать между собой 3 класса
Подскажите пожалуйста, как можно связать между собой 3 класса.

Как связать два вордовских файла между собой?
Ребят, можно ли связать два одинаковых вордовских файла, чтобы данные в одном обновлялись, если.

Решение

Создаем екземпляр класа студент, для етого немного переделаем конструктор, так как думал, что вам известно понятие серриализации, я этого не делал

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

сей метод проверяет есть ли уже данный предмет. если есть, оценки добавляет вконец списка, если нет, создает новый предмет куда вносит оценки.

Сохраняем нашего студента, что бы мы могли вновь с ним работать

Как подружить между собой два класса?
Как подружить между собой два класса? Один стоит выше другого. И тот, что выше, не видит того.

Связать между собой два модуля
Такая вот проблема. Надо лабу делать по программированию и одно из главных условий это что бы.


Связать классы между собой. реализовать ссылки одного класса на другой
Объясните, пожалуйста, что означает тема моей лабораторной :"связать классы между собой.

Разработать три класса, которые следует связать между собой, используя наследование
Разработать три класса, которые следует связать между собой, используя наследование: класс.

В Java вложенные классы – это классы, которые определены внутри другого класса.

Цель – четко сгруппировать вложенный класс с окружающим его классом, сигнализируя о том, что эти два класса должны использоваться вместе. Или, возможно, что вложенный должен использоваться только внутри его вмещающего (владеющего) класса.

Java-разработчики часто используют внутренние классы (нестатические вложенные) – это только один из нескольких различных типов:

  • статические;
  • нестатические;
  • локальные;
  • анонимные.

Вложенные считаются членами включающего их класса. Таким образом, могут быть объявлены как открытые, пакетные (без модификатора доступа), защищенные и приватные. Поэтому могут наследоваться подклассами.

Статические

Чтобы создать экземпляр класса Nested, вы должны сослаться на него, добавив к нему префикс имени внешнего класса, например:

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

Нестатические внутренние классы

Нестатические вложенные также называются внутренними и связаны с экземпляром включающего класса. Таким образом, вы должны сначала создать экземпляр окружающего класса, чтобы создать экземпляр внутреннего:

Вот как вы создаете экземпляр класса Inner:

Обратите внимание, как вы ставите new после ссылки на внешний класс, чтобы создать экземпляр внутреннего.

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

Обратите внимание, как метод printText() класса Inner ссылается на поле частного текста класса Outer. Это вполне возможно. Вот как вы бы вызвали метод printText():

Shadowing

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

В приведенном выше примере класс Outer и Inner содержит поле с именем text. Когда класс Inner ссылается на текст, он ссылается на свое собственное поле. Когда Outer ссылается на текст, он также ссылается на свое собственное поле.

Java позволяет классу Inner ссылаться на текстовое поле класса Outer. Для этого ему нужно добавить префикс ссылки на текстовое поле к Outer.this. (имя внешнего класса + .this. + имя поля), например:

Теперь метод Inner.printText() будет печатать поля Inner.text и Outer.text.

Локальные

Локальные классы в Java похожи на внутренние (нестатические вложенные), которые определены внутри метода или блока контекста() внутри метода:

Характеристика локальных классов:

  • Доступ возможен только из метода или блока контекста, в котором они определены.
  • Могут получать доступ к членам (полям и методам) своего окружающего класса, как и обычные внутренние.
  • Могут обращаться к локальным переменным внутри того же метода или блока области действия, если эти переменные объявлены как окончательные.
  • Из Java 8 могут обращаться к локальным переменным и параметрам метода, в котором объявлен локальный класс. Параметр должен быть объявлен как final или быть им. Фактически это означает, что переменная никогда не изменяется после инициализации. Параметры метода часто являются фактически окончательными.
  • Могут быть объявлены внутри статических методов. В этом случае локальный класс имеет доступ только к статическим частям окружающего класса.
  • Не могут содержать все виды статических объявлений (допустимы константы – переменные объявлены как static final), потому что не являются статичными по своей природе – даже если они объявлены внутри статического метода.
  • Для них применяются те же правила затенения, что и для внутренних классов.

Анонимные

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

Определяются, когда они создаются. Вот пример, который объявляет анонимный подкласс суперкласса с именем SuperClass:

Запуск этого кода приведет к тому, что анонимный класс doIt() будет напечатан в System.out. Он расширяет SuperClass и переопределяет метод doIt().

Анонимный класс также может реализовывать интерфейс вместо расширения класса:

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

Этот тип класса может получить доступ к членам включающего класса. Также к локальным переменным, которые объявлены как final.

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

К этому типу класса применяются те же правила дублирования, что и к внутренним.

Преимущества

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

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

Примером может быть класс Cache. Внутри Cache вы можете объявить класс CacheEntry, который может содержать информацию о конкретной записи в кэше (кэшированное значение, время вставки, количество обращений и т. д.).

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

Вот два скелета реализации Cache, иллюстрирующие эти моменты:

Первый класс Cache скрывает свой вложенный класс CacheEntry, в то время как второй класс Cache предоставляет его.

Наследование Java дает возможность одному классу наследовать свойства другого класса. Также называется расширением класса .

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

Как метод повторного использования кода

Наследование может быть эффективным методом для обмена кодом между классами, которые имеют некоторые общие черты, но позволяя классам иметь некоторые части, которые отличаются.

Вот диаграмма, иллюстрирующая класс с именем Vehicle, который имеет два подкласса, называемые Car и Truck.

объяснение наследования

Класс Vehicle является суперклассом легковых и грузовых автомобилей. Автомобиль и Грузовик – подклассы Автомобиля. Класс Vehicle может содержать те поля и методы, которые нужны всем транспортным средствам (например, номерной знак, владелец и т. д.), Тогда как Car и Truck могут содержать поля и методы, специфичные для легковых и грузовых автомобилей.

Примечание. Некоторые люди утверждают, что наследование – это способ классификации ваших классов в зависимости от того, чем они являются. Автомобиль – это Автомобиль. Грузовик – транспортное средство. Однако на практике это не то, как вы определяете, какие суперклассы и подклассы должны иметь ваше приложение. Обычно это определяется тем, как вам нужно работать с ними в приложении.

Например, вам нужно ссылаться на объекты Car и Truck как объекты Vehicle? Вам нужно обрабатывать объекты Car и Truck одинаково? Тогда имеет смысл иметь общий суперкласс Vehicle для двух классов. Если вы никогда не обрабатываете объекты Car и Truck одним и тем же способом, нет смысла иметь для них общий суперкласс, кроме, возможно, совместного использования кода между ними (чтобы избежать написания дублирующего кода).

Классовые иерархии

Суперклассы и подклассы образуют структуру наследования. На вершине иерархии классов суперклассы. В нижней части иерархии – подклассы. Иерархия может иметь несколько уровней, то есть несколько уровней суперклассов и подклассов. Подкласс сам может быть суперклассом других подклассов и т. д.

Основы

Когда класс наследует от суперкласса, он наследует части методов и полей суперкласса. Подкласс также может переопределять (переопределять) унаследованные методы. Поля не могут быть переопределены, но могут быть «затенены» в подклассах. Как все это работает, рассказывается далее в этом тексте.

Что унаследовано?

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

Поля и методы с модификаторами доступа по умолчанию (пакет) могут быть доступны для подклассов, только если он находится в том же пакете, что и суперкласс. На частные поля и методы суперкласса никогда нельзя ссылаться непосредственно, только через методы, достижимые из подкласса (например, методы по умолчанию (пакет), защищенные и публичные).

Конструкторы не наследуются подклассами, но конструктор подкласса должен вызывать конструктор в суперклассе.

Единичное наследование

Механизм наследования позволяет наследовать класс только от одного суперкласса (единичное наследование). В некоторых языках программирования, таких как C ++, подкласс может наследоваться от нескольких суперклассов (множественное).

Так как множественный вариант может создать некоторые странные проблемы, например, суперклассы содержат методы с одинаковыми именами и параметрами, он был исключен в Java.

Объявление

Объявляется с использованием ключевого слова extends:

Класс Car в этом примере расширяет класс Vehicle, то есть Car наследуется от Vehicle. Поскольку Car расширяет Vehicle, защищенное поле licensePlate из Vehicle наследуется Car. Когда licensePlate наследуется, оно становится доступным внутри экземпляра Car.

В поле licensePlate на самом деле не ссылаются из класса Car в приведенном выше коде, но можно, если мы захотим:

Ссылка происходит внутри метода getLicensePlate(). Во многих случаях имело бы смысл поместить этот метод в класс Vehicle, где находится поле licensePlate.

Приведение типов

Можно ссылаться на подкласс как на экземпляр одного из его суперклассов. Например, используя определения класса из примера в предыдущем разделе, можно ссылаться на экземпляр класса Car как на экземпляр класса Vehicle. Так как Car расширяет (наследует) Vehicle, он также называется Vehicle.

Вот пример кода Java:

  1. Сначала создается экземпляр автомобиля.
  2. Экземпляр Car присваивается переменной типа Vehicle.
  3. Теперь переменная Vehicle (ссылка) указывает на экземпляр Car. Это возможно, потому что Car наследуется от Vehicle.

Как видите, можно использовать экземпляр некоторого подкласса, как если бы он был экземпляром его суперкласса. Таким образом, вам не нужно точно знать, к какому подклассу относится объект. Например, вы можете рассматривать экземпляры Грузовика и Автомобиля как экземпляры Транспортного средства.

Процесс ссылки на объект класса как тип, отличный от самого класса, называется приведением типа . Вы бросаете объект из одного типа в другой.

Upcasting и Downcasting

Вы всегда можете привести объект подкласса к одному из его суперклассов, либо из типа суперкласса к типу подкласса, но только если объект действительно является экземпляром этого подкласса (или экземпляром подкласса этого подкласса). Таким образом, этот пример downcasting действителен:

Однако следующий приведенный ниже пример недопустим. Компилятор примет его, но во время выполнения, выдаст исключение ClassCastException.

Объект «Грузовик» может быть передан объекту «Автомобиль», но позже он не может быть передан объекту «Автомобиль». Это приведет к исключению ClassCastException.

Переопределяющие методы

В подклассе вы можете переопределить методы, определенные в суперклассе:

Обратите внимание, как и класс Vehicle, и класс Car определяют метод setLicensePlate(). Теперь каждый раз, когда setLicensePlate() вызывается для объекта Car, вызывается метод, определенный в классе Car. Метод в суперклассе игнорируется.

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

Невозможно переопределить закрытые методы из суперкласса. Если суперкласс вызывает внутренний метод из другого, он будет продолжать вызывать его из суперкласса, даже при создании частного метода в подклассе с той же сигнатурой.

Аннотация @override

Если вы переопределяете метод в подклассе, и метод внезапно удаляется или переименовывается или его сигнатура изменяется в суперклассе, метод в подклассе больше не переопределяет метод в суперклассе. Было бы хорошо, если бы компилятор мог сказать вам, что переопределяемый метод больше не переопределяет метод в суперклассе, верно?

Для этого и нужна аннотация @ override. Вы размещаете ее над методом, который переопределяет метод в суперклассе:

Вызов методов суперкласса

Если вы переопределяете метод в подклассе, но по-прежнему должны вызывать метод, определенный в суперклассе, используйте ссылку super, например:

В приведенном выше примере кода метод setLicensePlate() в классе Car вызывает метод setLicensePlate() в классе Vehicle.

Вы можете вызывать реализации суперкласса из любого метода в подклассе, как описано выше. Он не должен быть из самого переопределенного метода. Например, вы могли бы также вызвать super.setLicensePlate() из метода в классе Car с именем updateLicensePlate(), который не переопределяет метод setLicensePlate().

Пример инструкции

Java содержит инструкцию с именем instanceof. Она может определить, является ли данный объект экземпляром некоторого класса:

После выполнения этого кода переменная isCar будет содержать значение true.

Инструкция instanceof также может использоваться для определения того, является ли объект экземпляром суперкласса своего класса. Вот пример, который проверяет, является ли объект Car экземпляром Vehicle:

Предполагая, что класс Car расширяет (наследует от) класс Vehicle, переменная isVehicle будет содержать значение true после выполнения этого кода. Объект Car также является объектом Vehicle, поскольку Car является подклассом Vehicle.

Как видите, инструкция instanceof может использоваться для изучения иерархии наследования. Тип переменной, используемый с ней, не влияет на ее результат. Посмотрите на этот пример:

Несмотря на то, что переменная транспортного средства имеет тип Vehicle, объект, на который она в конечном итоге указывает в этом примере, является объектом Car. Поэтому экземпляр транспортного средства автомобиля будет оценен как истинный.

Вот тот же пример, но с использованием объекта Truck вместо объекта Car:

После выполнения этого кода isCar будет содержать значение false. Объект Truck не является объектом Car.

Как наследуются

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

Однако, если подкласс вызывает метод в суперклассе, который обращается к полю с тем же именем, что и в подклассе, это поле в суперклассе, к которому осуществляется доступ.

Вот пример, который иллюстрирует, как поля в подклассах скрывают поля в суперклассах:

Обратите внимание, как для обоих классов определено поле licensePlate.

И класс Vehicle, и класс Car имеют методы setLicensePlate() и getLicensePlate(). Методы в классе Car вызывают соответствующие методы в классе Vehicle. В результате оба набора методов получают доступ к полю licensePlate в классе Vehicle.

Однако метод updateLicensePlate() в классе Car напрямую обращается к полю licensePlate. Таким образом, он получает доступ к полю licensePlate класса Car. Следовательно, вы не получите тот же результат, если вызовете setLicensePlate(), как при вызове метода updateLicense().

Посмотрите на следующие строки кода:

Этот код распечатает текст 123.

Метод updateLicensePlate() устанавливает значение номерного знака в поле licensePlate в классе Car. Однако метод getLicensePlate() возвращает значение поля licensePlate в классе Vehicle. Следовательно, значение 123, которое устанавливается как значение для поля licensePlate в классе Vehicle с помощью метода setLicensePlate(), является тем, что выводится на печать.

Конструкторы

Механизм наследования не включает конструкторы. Другими словами, конструкторы суперкласса не наследуются подклассами. Подклассы могут по-прежнему вызывать конструкторы в суперклассе, используя конструкцию super().

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

Обратите внимание на вызов super() внутри конструктора Car. Этот вызов super() выполняет конструктор в классе Vehicle.

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

Если класс не имеет какого-либо явного конструктора, компилятор вставляет неявный без аргументов. Таким образом, класс всегда имеет конструктор.

Поэтому следующая версия транспортного средства эквивалентна версии, показанной чуть выше:

Если конструктор явно не вызывает конструктор в суперклассе, компилятор вставляет неявный вызов конструктора no-arg в суперклассе. Это означает, что следующая версия класса Car фактически эквивалентна версии, показанной ранее:

Фактически, поскольку конструктор теперь пуст, мы могли бы опустить его, и компилятор вставил бы его и неявный вызов конструктора no-arg в суперклассе. Вот как тогда будут выглядеть два класса:

Даже если в этих двух классах не объявлено ни одного конструктора, они оба получают конструктор без аргументов, который в классе Car будет вызывать конструктор без аргументов в классе Vehicle.

Если бы класс Vehicle не имел конструктора без аргументов, но имел другой, который принимает параметры, компилятор жаловался бы. Класс Car затем должен был бы объявить конструктор, а внутри него вызвать конструктор в классе Vehicle.

Вложенные классы

Те же правила наследования применяются к вложенным классам. Если объявлены закрытыми, не наследуются. Вложенные классы с модификатором доступа по умолчанию (пакет) доступны только для подклассов, если подкласс находится в том же пакете, что и суперкласс. С модификатором защищенного или открытого доступа всегда наследуются подклассами.

Обратите внимание, как можно создать экземпляр вложенного класса MyNestedClass, который определен в суперклассе(MyClass) посредством ссылки на подкласс(MySubclass).

Финальные классы

Класс может быть объявлен окончательным(final):

Последний класс не может быть продлен. Другими словами, вы не можете наследовать от финального класса.

Абстрактные классы

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

Они предназначены для расширения / создания полной реализации. Таким образом, вполне возможно расширить абстрактный класс. Правила наследования такие же для них, как и для неабстрактных классов.

Java – это объектно-ориентированный язык программирования. Соединение в Java играет важную роль при работе с классами и объектами Java. Это в основном относится к тому уровню знаний, который один класс знает о другом классе.

Coupling на Java

Ситуация, когда объект может использоваться другим объектом, называется связью. Это:

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

Типы сцепления

Связывание в Java далее делится на два типа, а именно:

    • Тесная связь (Tight coupling).
    • Слабая связь (Loose coupling).

    Тесная связанность в Java

    Это когда группа классов сильно зависит друг от друга. Сценарий возникает, когда класс принимает на себя слишком много обязанностей или когда одна проблема распространяется на многие классы, а не на собственный класс. Ситуация, когда объект создает другой объект для его использования, называется Tight Coupling.

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

    Пример: Предположим, вы сделали два класса. Первый класс – это класс Volume, а другой класс оценивает объем блока. Любые изменения, которые будут сделаны в классе Volume, будут отражены в классе Box. Следовательно, оба класса взаимозависимы друг от друга. Эта ситуация особенно называется тесной связью.

    Ниже приведенный код поможет вам понять процесс реализации тесной связи.

    Пример 1

    Пример 2

    Слабая связь

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

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


    Как связать два класса между собой?
    Привет,помогите разобраться с связью классов,было задание про составление файла с результатами.

    Как связать два класса?
    Привет всем! Пишу диплом на MVC, есть нижний уровень DAL и средний BL. В DAL'е в UserRepository.

    Как связать два своих класса (подключить файлы)?
    Всем привет) Создал два класса-наследника от TImage. Создал в разных файлах - .cpp и .h для одного.


    Как связать сигнал одного класса со слотом другого класса, содержащего указатель на объект этого класса?
    Подскажите, пожалуйста, как связать сигнал одного класса со слотом другого класса, содержащего.

    Я тоже новенький, но я делал методами всё. Пару дней назад дописал. Правда проверку диагонали втупую делал. Но вертикаль и горизонталь проверяется для любого поля. Интеллект для ПК - в процессе.
    Если будет интересно - скину исходники

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

    Почему неправильно? Вполне нормально.

    Добавлено через 6 минут
    Использование playerSymbol это чисто для примера, к сути вопроса не относится и потому Ваш код не должен один в один соответствовать примеру.

    Читайте также: