Загрузка данных




Лабораторная работа № 3

3.1	Структура и содержание класса Java
Программы на языке Java создаются из классов. Класс представляет собой дис- кретный модуль со своими атрибутами и методами. Класс определяет базовую струк- туру объекта и во время выполнения программы обычно создается экземпляр этого класса.
Модификаторы класса
В объявлении класса может употребляться ряд служебных слов модификато- ров, придающих классу дополнительные свойства. Эти ключевые слова указываются перед словом class при объявлении:
1.	Модификатор public помечает класс признаком общедоступности.
2.	Класс, обозначенный модификатором abstract, трактуется как неполный. Со- здавать экземпляры такого класса запрещено.
3.	Класс, определенный как final, не допускает наследования. Ниже представлена общая структура класса Java:
package Имя Пакета;
import Импортируемые Классы;

доступ class Имя Класса {
доступ тип Имя Переменной [=начальное значение]; //поля класса

доступ Имя Класса ([список аргументов]) {//конструктор класса утверждения Конструктора
 
}
доступ Тип Возвращаемого Значения Имя Метода ([аргументы]) {
<Тело Метода>
}
}
Класс содержит перечень членов (members) как правило, трех типов: поля (fields), методы (methods) и вложенные типы. Вложенные типы – это объявления клас- сов или интерфейсов, размещенные в контексте объявлений других классов или ин- терфейсов.
Поля класса
Поля (fields) класса – переменные, относящиеся к классу и его объектам. Важно понимать, что значения переменных класса различаются в различных экземплярах этого класса, определяя его состояние. Формат полей (переменных) класса определя- ется следующим образом:
<Доступ> <Тип данных> <Имя Переменной> [= <Начальное_значение>];
Ниже приведен пример объявления класса Body, объекты которого описывают небесные тела (планеты):
class Body { //объявление класса Body
//объявление и инициализация переменных класса public long idNum; // номер объекта
public String name; //имя объекта
public Body orbits; //переменная, хранящая ссылку на орбиту public static long nextId = 0; //текущий номер орбиты
}
В объявлении класса содержится ключевое слово class. Объявление класса со- здает новый тип Body.
Ключевое слово static
Ключевое слово static используется для объявления статической переменной (метода или блока), которая не определяются для конкретного объекта класса. Напри- мер, объявленная переменная static int x = 0; означает, что есть только одна перемен- ная х, независимо от того, сколько экземпляров класса существует.
Методы (methods)
Методы (methods) – именованные фрагменты исполняемого кода класса, обу- славливающие особенности поведения объектов класса.
 
Формат объявления методов класса:
<Модификатор доступа> <Имя Класса> ([<аргументы>]) { тело метода
}
Существуют две категории методов:
1)	методы-конструкторы, которые используется только для создания эк- земпляра класса;
2)	другие методы, которые используются для реализации какой-либо функ-
ции.
3.2	Конструктор класса
Конструктор – это блок выражений, которые используются для инициализации объекта (определения значений переменных). Конструктор указывает, каким должен быть объект.
Конструкторы обладают тем же именем, что и класс, в составе которого они объявляются. За именем следует список (возможно, пустой) параметров и тело кон- структора – блок выражений, заключенный в фигурные скобки.
Рассмотрим особенности объявления конструкторов класса
Явное определение конструктора класса без аргументов
Ниже представлен пример инициализации класса Body () с помощью явного объявления конструктора без аргументов и выражений инициализации полей класса:
class Body {
public long idNum; //инициализация полей класса Body public String name = "<Без имени>";
public Body orbits = null; private static long nextId = 0;

Body () {//конструктор класса Body без аргументов idNum = nextId++;//выражение конструктора
}
}
Если значения переменных класса не определено, в этом случае они по умолча- нию получают: числовые поля класса получают нулевые значения, логические поля – значение false, ссылки – значение null.
Конструктор по умолчанию
 
Если конструктор не определен в классе, компилятор создает конструктор по умолчанию. Конструктор по умолчанию осуществляет вызов конструктора суперк- ласса.
Суперкласс
Суперклассом (superclass) для текущего класса (подкласса) (subclass) является исходный для него класс. В Java все классы являются потомками класса Object.
Определение конструктора класса c аргументами
Ниже представлен пример инициализации класса Body () с помощью явного объявления конструктора c аргументами:
class Body {
public long idNum; //инициализация полей класса Body public String name = "<Без имени>";
public Body orbits = null; private static long nextID = 0;
//конструктор с аргументами
Body (String bodyName, Body orbitsAround) { name = bodyName;
orbits = orbitsAround;
}
}
Применение ключевого слова this и super() в конструкторе
Тело конструктора может начинаться с вызова одного из конструкторов супер- класса (родителя), для этого записывается слово super() с параметрами конструктора суперкласса в скобках. Или с вызова другого конструктора этого же класса, для этого используется слово this():
Body (String name, Body orbits) { super();//вызов конструктора суперкласса
}
//вызов другого конструктора этого же класса Body (String name, Body orbits) {
this ();
this.name = name; this.orbits = orbits;
}
Конструктор – это метод особого назначения с функцией создания экземпляра класса – объекта с определенными значениями переменных. Все экземпляры одного
 
класса (объекты, порожденные от одного класса) имеют один и тот же набор свойств (атрибутов) и поведение, определяемое методами.
Создание объектов при помощи конструктора без параметров
Создавая объект с помощью оператора new, мы задаем имя соответствующего класса и конструктор без аргументов. Конструкторы указывают, каким должен созда- ваться экземпляр класса – объект. Сначала объявляется переменная sun, предназна- ченная для хранения ссылки на объект типа Body. Объект, на который ссылается пе- ременная sun, создается посредством оператора new. В этом случае для объекта вы- деляется память, а ссылка сохраняется в переменной sun.
//создание объекта sun (солнце) класса Body Body sun = new Body();
Пример создания объектов при помощи конструктора с параметрами Body sun = new Body("Солнце", null) ;
Body earth = new Body("Земля", sun);
Задание 1. Создание класса, его конструктора и объекта класса
Составить программу в соответствии с пунктами, представленными ниже. Про- грамма представляет собой пример ООП, в котором создается класс, его конструктор и объект класса для вывода на консоль конкретных значений переменных класса. В классе создаются и применяются следующие методы: статический метод print для вы- вода значений переменных объекта класса, методы Get с целью получения значения переменных объекта класса, метод main для организации вывода значений перемен- ных объекта класса на консоль.
Последовательность действий:
1.	Создать проект и присвоить ему имя ProjectOne (выберите из главного меню File> New> Java Project ...).
2.	Создать пакет. Убедитесь, что в проекте выделена папка src (папка хранения всех файлов проекта) и выберите File> New> Package. В поле Name диалогового окна New Java введите ru.ifmo.intro (имя пакета), выберите папку хранения (src) и нажмите кнопку Finish (рис. 22).

Рисунок 22
 
3.	Создать класс Person. Выбрать правой кнопкой мыши образованный ранее пакет и из появившегося контекстного меню выбрать New> Class	Отметьте public
static void main(String [] args), для того, чтобы Eclipse в составе создаваемого класса определил метод main() и нажмите кнопку Finish.
4.	Добавление переменных класса. Под заголовком класса добавьте следую- щий код java для определения переменных класса:
private String name; private int age; //возраст private int height; //рост private int weight; //вес
private String eyeColor; //цвет глаз private String gender; //пол
5.	Добавить к классу Person два конструктора. Напомним, что конструктор – это специальный метод, который используется для создания объектов класса. Введите под строкой public class Person () следующий код, определяющий конструктор:
public Person(String name, int age, int height, int weight, String eyeColor, String gender) {
this.name = name; this.age = age; this.height = height; this.weight = weight;
this.eyeColor = eyeColor; this.gender = gender;
}
Далее в классе введите конструктор по умолчанию (без параметров) следую- щего вида:
public Person() { super();

}
6.	Ниже введите код статического метода print следующего вида: public static void print(String str) {
System.out.println(str);
}
В коде метода выполняется единственный оператор языка Java, который выво- дит на экран строковое содержимое, полученное в аргументе String str. Поскольку сигнатура этого метода содержит ключевое слово static, то в дальнейшем из класса Person мы сможем обращаться к нему, просто указывая имя метода (print), а из других
 
классов, которых пока нет в нашем проекте, по имени класса и имени метода (Person.print).
7.	Генерация методов getter и setter.
В ООП не рекомендуется применять прямой доступ к свойствам какого-либо класса из методов других классов. Для этого используется набор методов объекта – интерфейс, посредством которого осуществляется все взаимодействие с этим объек- том.
Метод getter используется для получения значений переменных объекта. Метод setter для установки значений переменных объектов.
Eclipse содержит средства создания геттеров и сеттеров переменных, описан- ных в классе. Для этого выделите созданные переменные класса. Щелкните правой кнопкой мыши в любом месте редактора кода Person и в открывшемся контекстном меню выберите Source> Getters and Setters ... Когда откроется диалоговое окно, нажмите кнопку Select Getters. Выберите Last member (Последний член) в поле со

списком Insertion Point (Точка внедрения) и нажмите кнопку OK.
Рисунок 23 – Создания геттеров и сеттеров переменных объекта
8.	Кодирование метода main() – создать экземпляр класса Person, присвоить значение переменным экземпляра, а затем вывести их значения на консоль. Введите код и дополните его:
public static void main(String[] args) {

//создается объект с именем p с заданными значениями переменных эк- земпляра класса
Person p = new Person("James Bond",42,183,82,"Brown", "MALE");

//вывод текущих значений переменных объекта p с помощью метода print print("Имя: " + p.getName());
print("Возраст :" + p.getAge());
 
//вывод значения переменной Height
…
//вывод значения переменной Weight
…
//вывод значения переменной EyeColor
…
//вывод значения переменной Gender
…
}
В качестве параметра метода print используется конкатенация из литерала типа String в двойных апострофах и значения соответствующей переменной объекта p, по- лученного с помощью метода getXXX, например,
print("Name:"+p.getName()); для переменной name.
9.	В результате выполнения класса Person будет выведена информация на Console, представленная на рис. 24.

Рисунок 24 – Результат реализации класса Person
Краткая последовательность этапов программирования представлена ниже:
//объявление пакета
//объявление класса
//объявление переменных или полей класса
//объявление конструктора класса с параметрами и присвоение им значений пе- ременных класса
//объявление второго конструктора класса с обращением к конструктору супер- класса
 
//создание статического метода print с аргументом строкового типа и выраже- ния вывода на экран содержимого строковой переменной str
//применение методов Getters and Setters с целью получения значения перемен- ных класса
//создание метода main
//вызов метода print, выводящего на консоль значения строковой переменной str. Переменная формируется с помощью конкатенации литерала типа String в двой- ных апострофах и значения соответствующей переменной объекта p, полученного с помощью нестатического метода get.
Лабораторная работа № 4

4.1	Графический пакет AWT
Самой первой графической Java-библиотекой была библиотека AWT (Abstract Window Toolkit). Она была включена в первую версию JDK 1.0. Затем библиотека AWT была дополнена библиотекой Java 2D API, расширяющей возможности работы с двухмерной графикой и изображениями. Архитектура AWT устроена таким обра- зом, что компоненты размещаются в контейнерах (суперкласс java.awt.Container) По- мимо графических компонентов, библиотека AWT содержит классы и интерфейсы, позволяющие обрабатывать различные типы событий, генерируемые AWT-компо- нентами.
Суперклассом, представляющим все AWT-события, является класс java.awt.AWTEvent. Для обработки событий компонента необходимо создать класс- слушатель, реализующий интерфейс java.awt.event.ActionListener, и присоединить его к данному компоненту. Кроме пакетов java.awt и java.awt.event библиотека AWT включает в себя:
Пакет java.awt.color используется для создания цвета.
Пакет java.awt.datatransfer используется для передачи данных внутри приложе- ния и между приложениями.
Пакет java.awt.dnd реализует технологию Drag-and-Drop. Пакет java.awt.font обеспечивает поддержку шрифтов.
Пакет java.awt.geom реализует двухмерную геометрию.
Пакет java.awt.im обеспечивает поддержку нестандартных методов ввода тек-
ста.
 
Пакет java.awt.image используется для создания и редактирования графических изображений.
Пакет java.awt.print обеспечивает поддержку печати.
Иерархия классов AWT
Класс Component находится наверху иерархии AWT. Component – это абстракт- ный класс, который инкапсулирует все атрибуты визуального компонента. Объект Component отвечает за запоминание текущих цветов переднего плана и фона, выбран- ного шрифта текста, а также размеров и местоположения (рис. 25).



Рисунок 25 – Иерархия классов AWT
Container – это компонент AWT, который содержит другие компоненты, такие как кнопка, текстовое поле, таблицы и т. д. Контейнер является подклассом класса компонентов. Класс контейнера отслеживает и компонует добавляемые компоненты.
Класс Panel – это конкретный подкласс класса Container. Панель не содержит строку заголовка, строку меню или границу. Это контейнер, который используется для содержания компонентов. Класс Window создает окно верхнего уровня. Окно не имеет границ и меню.
Frame является подклассом класса Window и имеет заголовок и границы, а также изменяемый пользователем размер. Таким образом, для создания AWT при- ложения, в первую очередь, нужно создать объект Frame как окно верхнего уровня.
Мы создаем объект Frame, устанавливаем его размеры и делаем его видимым (см. лабораторную 2). В результате получаем окно с заголовком и кнопками миними- зации и закрытия окна. Однако закрыть такое окно мы не сможем (рис. 26). Для этого мы должны добавить слушателя событий окна.
 

 
Рисунок 26 – Объект Frame
Так как Frame – это контейнер, мы можем добавлять в него меню и другие эле- менты графического интерфейса пользователя, кнопки, метки, поля и т. д. Frame-кон- тейнер мы используем для работы с графикой.
Для работы с графикой в Java имеется класс Graphics пакета java.awt. Поскольку класс Graphics является абстрактным, т.к. графический контекст сильно зависит от конкретной графической платформы, создать экземпляры данного класса не удастся. Для простоты работы и снятия необходимости в самостоятельной реализации аб- страктных методов, каждая виртуальная машина Java реализует эти методы и создает объекты данного класса методом getGraphics() или с помощью аргумента метода paint(). В лабораторной работе мы использовали метод paint().
4.2	Построение графических примитивов
Класс Frame
Класс Frame поддерживает два конструктора:
Frame() – создает стандартное окно, которое не содержит заголовка; Frame(String заголовок) – создает окно с заголовком, указанным в пара- метре заголовок.
Методы класса Frame (см. лаб. 2)
1.	Метод setSize() используется для установки размеров окна. Существует две формы этого метода (с разными списками параметров).
2.	Метод getSize() используется для получения текущего размера окна.
3.	Метод setVisible() – показ окна.
4.	Метод setTitle() – установка заголовка окна.
Графические примитивы методы класса Graphics, которые используются для рисования фигур (см. лаб. 2).
Далее на примере рассмотрим процесс рисования.
 
Задание 1. Создание графического объекта
Создать класс статической отрисовки квадратов по диагонали окна Frame:

Этапы разработки программы:
1.	Создать проект с именем ProjectFor. Импортировать графические пакеты java.awt и javax.swing.
2.	Создать класс Picture, как расширение (наследник) класса JFrame пакета java.awt (см. лаб. №2, задание 3). Создать метод static void main(String[] args), форми- рующий объект класса Picture (), указав в качестве аргумента метода Название окна
«Рисунок».
3.	Создать конструктор с именем класса и строковым параметром s, который используется при обращении к конструктору суперкласса для записи параметра s в строку заголовка окна (значение параметра задается при создании объекта класса Picture ()).
4.	В теле конструктора определить следующие инструкции (см. лаб. №2):
1) обращение к конструктору суперкласса, 2) отключение менеджера расположения компонентов в окне, 3) установление размера окна (600x600, метод setSize класса Graphics), 4) указание вывода на экран создаваемого окна, 5) вызов метода заверше- ния программы после закрытия окна (указать конструкцию this перед методом, так как это метод суперкласса).
5.	Создать метод paintS(Graphics g), который реализует условие задачи (стати- ческое построение квадратов). В качестве аргумента метода используется переменная g типа Graphics (класс Graphics пакета awt). Эта переменная содержит графический контекст, включающий окно с панелью на которой имеются инструменты закрытия, свертывания, развертывания окна и с возможностью его названия:
g.setColor(Color.YELLOW); //установить желтый цвет (объект Color) g.fillRect(0, 0, 600, 600); //залить окно установленным цветом g.setColor(Color.blue);//установить синий цвет (объект Color)

int x1=0; //значение начальной точки по Х оси int y1=0; // значение начальной точки по Y оси
 
int x2=600; //размер окна по Х int y2=600; //размер окна по Y
g.drawLine(x1, y1, x2, y2); //прорисовка диагонали окна int c=50; //длины стороны квадрата
int z= x2*x2+y2*y2; //расчет длины диагонали окна
System.out.println(z); // вывод значения переменной z в консоль

int s= c*c + c*c; //расчет длины диагонали квадрата 50x50 System.out.println(s); //вывод значения переменной s в консоль

int i=0; //счетчик квадратов
g.fillRect (x1, y1, c, c); //прорисовка первого квадратам в 0 точке окна

while (s*++i<z) {пока сумма диагоналей прорисованных квадратов не станет больше длины диагонали окна
g.fillRect (x1+(i*c), y1+(i*c), c, c);//рисуем следующий квадрат
6.	Создать метод static void main(String[] args), создающий объект класса Picture ( ), указав в качестве аргумента метода Название окна «Рисунок».
Структура методов класса: класс Picture
метод main (String [] args) метод paintS (Graphics g)
Задание 2. Реализация динамики объекта
Создать на основе программы предыдущего задания класс с именем PictureD, реализующий процесс движения (динамики) заданного графического объекта по определенной в программе траектории (для рассмотренного примера – по диагонали). Для  этого  применить  задержку  рисования  по  времени  с  помощью  Ме- тода thread.sleep () (https://javarush.ru/groups/posts/isklyucheniya-java). Метод необхо- димо оформить следующим блоком:
try {
Thread.sleep(100);
} catch (InterruptedException e) { e.printStackTrace();	}
В этом случае создается впечатление, что объект (квадрат) движется (в рассмот- ренном примере по диагонали).
Метод прорисовки объектов назвать paintD (Graphics g).
 
Структура методов класса: класс Picture
метод main (String [] args) метод paintD (Graphics g)
Самостоятельное задание 1
Объединить в одном классе методы, созданные в предыдущих программах (ста- тический и динамический) и реализовать вызов одного из них по условию: если вве- сти с клавиатуры число 1 – вызывается статический метод и реализуется статическая прорисовка заданного объекта, если ввести с клавиатуры число 2 – вызывается дина- мический метод и реализуется динамическая прорисовка заданного объекта. Этапы программы:
Создать класс с именем с именем MyPicture, импортировать необходимые па- кеты. Сформировать метод public void paint(Graphics g), в котором реализуется вызов методов paintD или paintS по условию. Для этого необходимо: импортировать класс Scanner, создать экземпляр этого класса Scanner in = new Scanner(System.in), органи- зовать вывод сообщения в консоль (введите 1 или 2), в зависимости от введенного числа вызвать один из методов (paintS(g) или paintD(g)).
Структура методов класса MyPicture: класс Picture
метод main (String [] args) метод paint (Graphics g) метод paintS (Graphics g) метод paintD (Graphics g)