Видео:Строим вписанную в данный треугольник окружность (Задача 2).Скачать
Создание класса: свойства и методы
Рассмотрим пример создания простейшего класса. Давайте с его помощью смоделируем окружности на координатной плоскости.
Каждая такая окружность, как известно, будет определяться своим центром (т.е. точкой с двумя числовыми координатами) и радиусом (т.е. его длиной, представляемой в виде числа). Таким образом, окружность на координатной плоскости характеризуют 3 вещественных числа. Значит в нашем классе должно быть три соответствующих свойства.
Пока не будем пытаться решать серьёзных задач с помощью класса, а наделим его следующими возможностями: созданную на основе класса окружность должно быть возможно выводить на экран (в виде описания её характеристик), перемещать (т.е. совершать преобразование движения, меняя координаты её центра) и масштабировать (т.е. совершать преобразование подобия, меняя радиус окружности).
Видео:Построить описанную окружность (Задача 1)Скачать
Конструкторы
Когда мы создаём объект командой Circle o1 = new Circle(); используется так называемый конструктор по умолчанию (или конструктор без параметров) — это специальный метод класса, мы его не определяли явно, но даже если его не определить он создаётся автоматически, выполняется при создании каждого нового объекта и присваивает первоначальные значения его свойствам (инициализирует их). Значения по умолчанию для свойств зависят от их типа (0 или 0.0 для чиловых типов, false для логического типа и т.д.).
Конструктор по умолчанию можно описать явно и при этом задать началльные значения для свойств нового объекта, отличные от значений по умолчанию.
От остальных методов конструктор отличается тем, что имеет то же самое имя, что и весь класс, а также не имеет типа возвращаемого значения (по сути, в результате своей работы конструктор возвращает новый объект нужного класса).
Поскольку методы можно перегружать, а конструктор является методом, то с помощью перегрузки можно создать дополнительные варианты конструкторов. Например, удобно иметь конструктор, который позволит при создании объекта явно указывать координаты его центра и длину радиуса.
Описать подобный конструктор можно в дополнение к основному следующим образом:
Теперь при создании объектов можно пользоваться любым конструктором на выбор:
Нужно учитывать следующий факт: если в классе описан явно хотя бы один конструктор с параметрами, то конструктор по умолчанию (без параметров) создаваться автоматические уже не будет (его в такой ситуации надо описывать явно). Хотя, если вам требуется только конструктор с параметрами (как второй из нашего примера), то можно обойтись и совсем без конструктора по умолчанию (описать в классе только один конструктор с параметрами).
Видео:Построение окружности по трём точкам.Скачать
Доступ к членам класса из тела методов
Добавим в наш класс метод, вычисляющий площадь той окружности, к которой метод применён. Метод будет описывать так:
Результат работы метода можно увидеть следующим образом:
Обратите внимание: внутри каждого метода класса доступны свойства того объекта, для которого метод будет вызываться. То есть если мы вызываем метод для объекта o2, то внутри метода при его выполнении мы будем работать именно со свойствами объекта o2 (o2.x будет доступно x, o2.r будет доступно как r и т.д.).
Может возникнуть ситуация, когда для формальных параметров метода вы захотите использовать имена уже принадлежащие свойствам класса.
Например, можно было бы начать описание метода для масштабирования таким образом:
Как же в таком случае обращаться к свойствам объекта (ведь имена этих свойств перекрываются формальным параметром)?
Решение такой неоднозначности существует: к любому свойству внутри метода можно обращаться не только по имени, но и через ссылку this. То есть внутри метода можно написать x=13;, а можно this.x=13; — эффект будет идентичный. Соответственно, когда имя формального параметра перекрывает имя свойства, к имени свойства нужно обращаться через ссылку this. Тогда метод можно переписать таким образом:
Понятно, что удобнее не допускать перекрывания имён свойств именами локальных параметров в методах. Иногда, впрочем, требуется внутри метода применить какой-то другой метод к текущему объекту, тогда без ссылки this не обойтись.
Добавим в класс метод, проверяющий, совпадают ли две окружности по площади.
В этом методе должны участвовать два объекта: тот, для которого метод вызван и второй участник сравнения, который может быть передан в метод через параметр. При этом параметр будет иметь соответствующий тип (не какой-то встроенный, а в виде класса Circle).
Метод можно описать так:
Пример использования метода:
Видео:Деление окружностей на равные частиСкачать
Задачи
- Создайте в классе Circle метод, вычисляющий длину окружности.
- Создайте в классе Circle метод, перемещающий центр круга в случайную точку квадрата координатной плоскости с диагональю от [-99;-99] до [99;99]. Обратите внимание на то, что требуется создать обычный метод, применимый к уже существующему объекту, а не конструктор создающий новый объект.
- Измените в классе Circle конструктор по умолчанию так, чтобы в момент создания объекта с его помощью, координаты центра и радиус окружности пользователь вводил с клавиатуры.
- Создайте в классе Circle метод, вычисляющий расстояние между центрами двух окружностей.
- Создайте в классе Circle метод, проверяющий, касаются ли окружности в одной точке. Учтите, что возможен вариант, когда одна окружность содержится внутри другой и при этом всё равно возможно касание в одной точке.
Видео:Треугольник, вписанный в окружность геометрия 7 классСкачать
Пример
Рассмотрим пример класса точек на плоскости:
В этом классе создаётся отдельный метод toString(), предназначенный для представления каждого объекта в виде строки. Этот метод можно использовать для собственных нужд (например, он вызывается в методе printPoint(), печатающем строку на экран), но кроме этого метод toString() будет вызываться автоматически, когда возникнет попытка автоприведения объекта к строковому типу.
Например, мы можем пользоваться методом явно:
А можем просто обединять наш объект с другой строкой, провоцируя автоприведение:
Результат при этом будем получать идентичный.
Такой особенный метод toString() существует на самом деле для всех объектов в Java. Любой класс в Java является наследниом класса Object (хотя наследование мы явно при создании своего класса никак не используем) и от этого родительского класса получает ряд готовых методов (среди которых toString() тоже присутствует). Теперь в классе Point мы метод toString() перегрузили, сделав для него такую реализацию, которая требуется нам в нашей программе.
Ещё один яркий пример метода, наследуемого от коренного класса Object — это метод equals(Object o) для сравнения объектов — его можно применять к любым двум объектам (даже если они из разных классов), вызывая метод для одного из них, а второй передавая через параметр. Метод будет возвращать истинное значение тогда и только тогда, когда будет вызван для двух ссылок на один и тот же объект. В своих программах с практической точки зрения равными можно считать разные объекты имеющие одинаковый набор текущих значений в полях, поэтому метод equals обычно тоже перегружают. Вместе с ним обязательно перегружать и метод hashCode(), возвращающий некоторое целое число для каждого объекта, являющегося его уникальным числовым идентификатором (хешем). По умолчанию (в той реализации, которая представлена в классе Object) это число строится на основании адреса объекта в памяти, но при перегрузке метода можно придумать свою собственную реализацию, главное, чтобы она удовлетворяла одному важному правилу: если два обекта совпадают в соответствии с методом equals, то у них должны быть одинаковые хеши, возвращаемые методом hashCode(), при этом обратного не требуется. Например, для нашего класса Point мы могли бы в качестве хеша возвращать произведение координат точки.
Не требуется, но рекомендуется для своих классов перегружать перечисленные выше методы. В примере это сделано для метода toString, но не сделано для equals и hashCode.
Создайте в классе метод, который будет выводить на экран сообщение о том, в какой координатной четверти лежит точка.
Создайте в классе метод, проверяющий, являются ли две точки симметричными относительно начала отсчёта.
Измените в классе конструктор по умолчанию таким образом, чтобы начальные координаты точки при её создании пользователь задавал с клавиатуры.
Создайте в классе метод, проверяющий, являются ли три точки коллинеарными (т.е. лежащими на одной прямой).
Вместо представленного метода equalsPoint перегрузите в классе методы equals и hashCode.
Видео:Урок 43. Криволинейное движение. Равномерное движение по окружности. Центростремительное ускорениеСкачать
Создание собственных классов в Java: свойства, методы, конструкторы
Видео:2 2 3 построение изометрии окружностиСкачать
Создание класса: свойства и методы
Рассмотрим пример создания простейшего класса. Давайте с его помощью смоделируем окружности на координатной плоскости.
Каждая такая окружность, как известно, будет определяться своим центром (т.е. точкой с двумя числовыми координатами) и радиусом (т.е. его длиной, представляемой в виде числа). Таким образом, окружность на координатной плоскости характеризуют 3 вещественных числа. Значит в нашем классе должно быть три соответствующих свойства.
Пока не будем пытаться решать серьёзных задач с помощью класса, а наделим его следующими возможностями: созданную на основе класса окружность должно быть возможно выводить на экран (в виде описания её характеристик), перемещать (т.е. совершать преобразование движения, меняя координаты её центра) и масштабировать (т.е. совершать преобразование подобия, меняя радиус окружности).
Видео:1 2 4 сопряжение окружностейСкачать
Конструкторы
Когда мы создаём объект командой Circle o1 = new Circle(); используется так называемый конструктор по умолчанию (или конструктор без параметров) — это специальный метод класса, мы его не определяли явно, но даже если его не определить он создаётся автоматически, выполняется при создании каждого нового объекта и присваивает первоначальные значения его свойствам (инициализирует их). Значения по умолчанию для свойств зависят от их типа (0 или 0.0 для чиловых типов, false для логического типа и т.д.).
Конструктор по умолчанию можно описать явно и при этом задать началльные значения для свойств нового объекта, отличные от значений по умолчанию.
От остальных методов конструктор отличается тем, что имеет то же самое имя, что и весь класс, а также не имеет типа возвращаемого значения (по сути, в результате своей работы конструктор возвращает новый объект нужного класса).
Видео:Что такое класс. Что такое объект класса. Экземпляр класса это. Класс ООП это. Урок #73Скачать
Создание экземпляра класса.
Для того чтобы создать экземпляр класса необходимо объявить переменную, тип которой соответствует имени класса или суперкласса. После чего нужно присвоить этой переменной значение, вызвав конструктор создаваемого класса с помощью оператора new. Например, можно создать экземпляр класса Rectangle следующим образом:
Rectangle rect = new Rectangle(20, 10); |
После этого можно вызывать методы этого класса для объекта rect, указав имя метода через точку:
rect.setWidth(20); System.out.println(«Новаяширина: «+rect.getWidth()); |
ВАРИАНТЫ ЗАДАНИЙ
1. Создать класс, описывающий модель окружности (Circle). В классе должны быть описаны нужные свойства окружности и методы для получения, изменения этих свойств. Протестировать работу класса в классе CircleTest, содержащим метод статический main(String[] args).
2. Создать класс, описывающий тело человека(Human). Для описания каждой части тела создать отдельные классы(Head, Leg, Hand). Описать необходимые свойства и методы для каждого класса. Протестировать работу класса Human.
3. Создать класс, описывающий книгу(Book). В классе должны быть описаны нужные свойства книги(автор, название, год написания и т. д.)и методы для получения, изменения этих свойств. Протестировать работу класса в классе BookTest, содержащим метод статический main(String[] args).
ЛАБОРАТОРНАЯ РАБОТА №3
НАСЛЕДОВАНИЕ В JAVA
ЦЕЛЬ ЛАБОРАТОРНОЙ РАБОТЫ:
Цель данной лабораторной работы — изучить понятие наследования, и научиться реализовывать наследование в Java.
ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ:
Одним из ключевых аспектов объектно-ориентированного программирования является наследование. С помощью наследования можно расширить функционал уже имеющихся классов за счет добавления нового функционала или изменения старого. Например, имеется следующий класс Person, описывающий отдельного человека:
public class Person < private String name; private String surname; public String getName() public String getSurname() public Person(String name, String surname) public void displayInfo() > |
И, возможно, впоследствии мы решили расширить имеющуюся систему и классов, добавив в нее класс, описывающий сотрудника предприятия — класс Employee. Так как этот класс реализует тот же функционал, что и класс Person, так как сотрудник — это также и человек, то было бы рационально сделать класс Employee производным (или наследником) от класса Person, который, в свою очередь, называется базовым классом или родителем:
classEmployeeextendsPerson |
Чтобы объявить один класс наследником от другого, надо использовать после имени класса-наследника ключевое слово extends, после которого идет имя базового класса. Для класса Employee базовым является Person, и поэтому класс Employee наследует все те же поля и методы, которые есть в классе Person.
В классе Employee могут быть определены свои методы и поля, а также конструктор. Способность к изменению функциональности, унаследованной от базового класса, назвывается полиморфизмом и является одинм из ключевых аспектов объектно-ориентированного программирования наряду с наследованием и инкапсуляцией.
Например, переопределим метод displayInfo() класса Person в классе Employee:
class Employee extends Person < private String company; public Employee(String name, String surname, String company) public void displayInfo() > |
Класс Employee определяет дополнительное поле для хранения компании, в которой работает сотрудник. Кроме того, оно также устанавливается в конструкторе.
Так как поля name и surname в базовом классе Person объявлены с модификатором private, то мы не можем к ним напрямую обратиться из класса Employee. Однако в данном случае нам это не нужно. Чтобы их установить, мы обращаемся к конструктору базового класса с помощью ключевого слова super, в скобках после которого идет перечисление передаваемых аргументов.
С помощью ключевого слова super мы можем обратиться к любому члену базового класса — методу или полю, если они не определены с модификатором private.
Также в классе Employee переопределяется метод displayInfo() базового класса. В нем с помощью ключевого super также идет обращение к методу displayInfo(), но уже базового класса, и затем выводится дополнительная информация, относящаяся только к Employee.
Используя обращение к методом базового класса, можно было бы переопределить метод displayInfo() следующим образом:
public void displayInfo() |
При этом нам необязательно переопределять все методы базового класса. Например, в данном случае мы не переопределяем методы getName() и getSurname(). Поэтому для этих методов класс-наследник будет использовать реализацию из базового класса. И в основной программе мы можем эти методы использовать:
public static void main(String[] args) |
Хотя наследование очень интересный и эффективный механизм, но в некоторых ситуациях его применение может быть нежелательным. И в этом случае можно запретить наследование с помощью ключевого слова final. Например:
public final class Person |
Если бы класс Person был бы определен таким образом, то следующий код был бы ошибочным и не сработал, так как мы тем самым запретили наследование:
classEmployeeextendsPerson |
Кроме запрета наследования можно также запретить переопределение отдельных методов. Например, в примере выше переопределен метод displayInfo(), запретим его переопределение:
public class Person < //. public final void displayInfo()> |
В этом случае в классе Employee надо будет создать метод с другим именем для вывода информации об объекте.
Абстрактные классы
Кроме обычных классов в Java есть абстрактные классы. Абстрактный класс похож на обычный класс. В абстрактном классе также можно определить поля и методы, в то же время нельзя создать объект или экземпляр абстрактного класса. Абстрактные классы призваны предоставлять базовый функционал для классов-наследников. А производные классы уже реализуют этот функционал.
При определении абстрактных классов используется ключевое слово abstract:
public abstract class Human < privateint height; private double weight; publicintgetHeight() public double getWeight() > |
Кроме обычных методов абстрактный класс может содержать абстрактные методы. Такие методы определяются с помощью ключевого слова abstract и не имеют никакого функционала:
public abstractvoiddisplayInfo(); |
Производный класс обязан переопределить и реализовать все абстрактные методы, которые имеются в базовом абстрактном классе. Также следует учитывать, что если класс имеет хотя бы один абстрактный метод, то данный класс должен быть определен как абстрактный.
Зачем нужны абстрактные классы? Допустим, мы делаем программу для обсулживания банковских операций и определяем в ней три класса: Person, который описывает человека, Employee, который описывает банковского служащего, и класс Client, который представляет клиента банка. Очевидно, что классы Employee и Client будут производными от класса Person, так как оба класса имеют некоторые общие поля и методы. И так как все объекты будут представлять либо сотрудника, либо клиента банка, то напрямую мы от класса Person создавать объекты не будем. Поэтому имеет смысл сделать его абстрактным.
public abstract class Person < private String name; private String surname; public String getName() public String getSurname() public Person(String name, String surname) public abstract void displayInfo(); > class Employee extends Person < private String bank; public Employee(String name, String surname, String company) public void displayInfo() > class Client extends Person < private String bank; public Client(String name, String surname, String company) public void displayInfo() > |
ВАРИАНТЫ ЗАДАНИЙ
1. Создать абстрактный класс, описывающий посуду(Dish). С помощью наследования реализовать различные виды посуды, имеющие свои свойства и методы. Протестировать работу классов.
2. Создать абстрактный класс, описывающий собак(Dog). С помощью наследования реализовать различные породы собак. Протестировать работу классов.
3. Создать абстрактный класс, описывающий мебель. С помощью наследования реализовать различные виды мебели. Также создать класс FurnitureShop, моделирующий магазин мебели. Протестировать работу классов.
ЛАБОРАТОРНАЯ РАБОТА №4
ИНТЕРФЕЙСЫВ JAVA .
ЦЕЛЬ ЛАБОРАТОРНОЙ РАБОТЫ:
Цель данной лабораторной работы — изучить понятие интерфейса, научиться создавать интерфейсы в Java и применять их в программах.
ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ:
Механизм наследования очень удобен, но он имеет свои ограничения. В частности мы можем наследовать только от одного класса, в отличие, например, от языка С++, где имеется множественное наследование.
В языке Java подобную проблему позволяют решить интерфейсы. Интерфейсы определяют некоторый функционал, не имеющий конкретной реализации, который затем реализуют классы, применяющие эти интерфейсы. И один класс может применить множество интерфейсов.
Чтобы определить интерфейс, используется ключевое слово interface.
Определим следующий интерфейс:
public interface Printable |
Интерфейс может определять различные методы, которые, так же как и абстрактные методы абстрактных классов не имеют реализации. В данном случае объявлен только один метод.
Все методы интерфейса не имеют модификаторов доступа, но фактически по умолчанию доступ public, так как цель интерфейса — определение функционала для реализации его классом. Поэтому весь функционал должен быть открыт для реализации.
И также при объявлении интерфейса надо учитывать, что только один интерфейс в файле может иметь тип доступа public. А его название должно совпадать с именем файла. Остальные интерфейсы (если такие имеются в файле java) не должны иметь модификаторов доступа.
Интерфейс может определять различные методы, которые, так же как и абстрактные методы абстрактных классов не имеют реализации. В данном случае объявлен только один метод.
Все методы интерфейса не имеют модификаторов доступа, но фактически по умолчанию доступ public, так как цель интерфейса — определение функционала для реализации его классом. Поэтому весь функционал должен быть открыт для реализации.
И также при объявлении интерфейса надо учитывать, что только один интерфейс в файле может иметь тип доступа public. А его название должно совпадать с именем файла. Остальные интерфейсы (если такие имеются в файле java) не должны иметь модификаторов доступа.
Чтобы класс применил интерфейс, надо использовать ключевое слово implements:
class Book implements Printable < String name; String author; int year; Book(String name, String author, int year)public void print() > |
При этом надо учитывать, что если класс применяет интерфейс, то он должен реализовать все методы интерфейса, как в случае выше реализован метод print.
Потом в главном классе мы можем использовать данный класс и его метод print:
Book b1 = new Book(«Война и мир», «Л. Н. Толстой», 1863); b1.print(); |
В тоже время мы не можем напрямую создавать объекты интерфейсов, поэтому следующий код не будет работать:
Printable pr = new Printable(); pr.print(); |
Одним из преимуществ использоваия интерфейсов является то, что они позволяют добавить в приложение гибкости. Например, в дополнение к классу Book определим еще один класс, который будет реализовывать интерфейс Printable:
public class Journal implements Printable < private String name; String getName()Journal(String name) public void print() > |
Класс Book и класс Journal связаны тем, что они реализуют интерфейс Printable. Поэтому мы динамически в программе можем создавать объекты Printable как экземпляры обоих классов:
Printable printable = new Book(«Войнаимир», «Л. Н. Толстой», 1863); printable.print(); printable = new Journal(«Хакер»); printable.print(); |
И также как и в случае с классами, интерфейсы могут использоваться в качестве типа параметров метода или в качестве возвращаемого типа:
public static void main(String[] args) static void read(Printable p) static Printable createPrintable(String name, boolean option) < if(option) return new Book(name, "неизвестен", 2015); else return new Journal(name); |
Метод read() в качестве параметра принимает объект интерфейса Printable, поэтому в этот метод мы можем передать как объект Book, так и объект Journal.
Метод createPrintable() возвращает объект Printable, поэтому также мы вожем возвратить как объект Book, так и Journal.
ВАРИАНТЫ ЗАДАНИЙ
1. Создать интерфейс Nameable, с методом getName(), возвращающим имя объекта, реализующего интерфейс. Проверить работу для различных объектов (например, можно создать классы, описывающие разные сущности, которые могут иметь имя: планеты, машины, животные и т. д.).
2. Реализовать интерфейс Priceable, имеющий метод getPrice(), возвращающий некоторую цену для объекта. Проверить работу для различных классов, сущности которых могут иметь цену.
📺 Видео
4K Как построить правильный пятиугольник, how to draw a regular pentagonСкачать
Как найти центр окружности с помощью циркуля и линейкиСкачать
КАК НАРИСОВАТЬ КРУГ В ИЗОМЕТРИИ (ОВАЛ В ИЗОМЕТРИЧЕСКОЙ ПРОЕКЦИИ).Скачать
Уроки Java для начинающих | #13 - Создание класса и объектаСкачать
Урок 7. Окружность, круг и их элементы. ОГЭ. Вебинар |МатематикаСкачать
СЕЧЕНИЯ. СТРАШНЫЙ УРОК | Математика | TutorOnlineСкачать
Java FX урок 4 - Классы Circle и Text и их методыСкачать
Java для начинающих. Урок 14: Классы и объекты.Скачать
Длина хорды окружности равна 72 ... | ОГЭ 2017 | ЗАДАНИЕ 10 | ШКОЛА ПИФАГОРАСкачать
Как Найти Радиус Сегмента на Потолке. Радиус Окружности По Хорде И Высоте СегментаСкачать
Программа на Java считает площадь и периметр круга (окружность)Скачать