- •Лекция 1. Вступление в Java. Средства разработки программ. План
- •Лекция 2. Структуры и типы данных в Java. План
- •Лекция 3. Классы и методы в Java. Операция финализации в Java. План
- •Лекция 4. Апплеты в Java. План
- •Лекция 5. Модель обработки событий Java1.0. Реализация графического интерфейса в Java. План
- •Лекция 6. Многопоточное программирование в Java. План
- •Принципы многопоточного программирования. Состояния потоков.
- •Создание потока.
- •Синхронизация потоков.
- •Лекция 7. Безопасность в Java. План
- •Принципы многопоточного программирования. Состояния потоков.
- •Создание потока.
- •Синхронизация потоков.
Лекция 3. Классы и методы в Java. Операция финализации в Java. План
Классы в Java. Определение класса и создание объекта класса.
Методы в Java.
Конструкторы в Java.
Перегрузка методов.
Перегрузка конструкторов.
Использование объектов в качестве параметров.
Использование ключевого слова this.
Сбор мусора в Java. Операция финализации.
1.
Класс определяет новый тип данных. Он может использоваться для создания объектов данного класса. Объекты – это экземпляры класса.
Определяя класс, необходимо описать его природу. Делается это с помощью определения данных, которые в нем содержатся, и программного кода, который им управляет.
class <имя_класса> {
<тип_переменной> <переменная1>;
...
<тип_переменной> <переменнаяN>;
<тип_метода> <имя_метода1>([<параметры>]) {
<тело_метода>
}
...
<тип_метода> <имя_методаN>([<параметры>]) {
<тело_метода>
}
}
Весь программный код находится в методах. Методы и переменные являются членами класса.
Переменные, описанные в классе, – экземпляры переменных, т.к. каждый экземпляр класса содержит копию этих переменных.
Создание объекта класса происходит в две стадии:
объявляем переменную данного типа, она просто ссылается на класс;
физическая копия объекта создается и осуществляется связывание ее с объявленной переменной при помощи оператора new. Оператор new динамически размещает объект в памяти и возвращает ссылку на него.
Описание класса:
Box mybox;
mybox = new Box();
или
Box mybox = new Box();
где Box() – вызов конструктора класса.
2.
Тип метода – тип данных, который возвращает данный метод (простой тип или тип созданного класса).
Если метод не возвращает объекта, то тип void.
Если тип метода указан не void, то в теле методы должна быть указана следующая команда:
return <значение>;
Параметр метода – последовательность типов и идентификаторов через запятую.
3.
Конструктор инициализирует объект во время создания. Имя конструктора совпадает с именем класса.
Конструктор вызывается автоматически после создания объекта перед тем, как оператор new закончит свою работу. Конструкторы подобны методам, но в отличие от них ничего не возвращают. Конструкторы и методы похожи синтаксически.
Это происходит потому, что конструктор класса неявно возвращает значение, тип которого соответствует данному классу.
Пример:
class Box{
double width, height, depth;
Box(double w, double h, double d){
width=w;
height=h;
depth=d;
}
double volume(){
double v;
v=width*height*depth;
return v;
}
}
class BoxDemo{
public static void main(String args[]){
Box mybox1=new Box(1,2,3);
Box mybox2=new Box(2,3,4);
double vol;
vol=mybox1.volume();
System.out.println(“Объем 1”);
vol=mybox2.volume();
System.out.println(“Объем 2”);
}
}
4.
В Java допускается определение одного или нескольких методов в одном классе и под одним именем в том случае, если списки параметров различны. Такие методы называются перегруженными, а соответствующий процесс – перегрузкой методов.
При перегрузке методов, чтобы определить, какую из версий следует использовать, применяется количество и/или тип аргументов методов. Типы возвращаемых значений перегруженных методов могут быть различны.
Пример:
void test(){
System.out.println(“Без параметров”);
void test(int a){
System.out.println(“a=”+a);
double test(double a){
return a*a;
При работе программы можно вызвать любую версию метода:
do.test();
do.test(5);
do.test(5.5);
Если не удается найти точное соответствие типов параметров, то Java прибегает к преобразованию типов, после чего вызывается соответствующая версия метода.
Кроме этого, можно перегружать и конструкторы.
5.
Возвращаясь к нашему примеру, может возникнуть ситуация задания коробки без параметров или куба с требованием трех параметров.
Перегрузка конструкторов позволяет решить эти проблемы.
К уже имеющемуся конструктору добавляем:
Box(){
width=-1;
height=-1;
depth=-1;
}
Box(double l){
width=height=depth=l;
}
6.
В метод в качестве параметров могут передаваться и объекты.
Пример:
class Test{
int a,b;
Test(int a, int b){
a=i;
b=j;
}
boolean equals(Test ob){
if (ob.a==a && ob.b==b)
return true;
else return false;
}
}
class Test1{
public static void main(String args[]){
Test ob1=new Test(1,2);
Test ob2=new Test(1,2);
Test ob3=new Test(1,3);
ob1.equals(ob2);
ob1.equals(ob3);
}
}
Описанный метод equals в классе Test сравнивает объект, в котором он был вызван, с объектом, переданным в качестве параметра.
Использование объектов в качестве параметров полезно в случае, когда необходимо создать объект – точную копию уже созданного. Для этого необходимо написать конструктор, принимающий в качестве параметра объект собственного класса.
Пример:
Box(Box ob){
width=ob.width;
height=ob.height;
depth=ob.depth;
}
Чтобы его использовать, необходимо:
Box copy1=new Box(ob1);
Существует два способа передачи аргумента подпрограмме:
передача по значению – копирует в формальный параметр подпрограммы значение аргумента, т.е. все изменения с параметром подпрограммы не влияют на аргумент, используемый при вызове;
передача по ссылке – в качестве параметра передается ссылка на аргумент, а не его значение; в подпрограмме эта ссылка используется для доступа к настоящему аргументу, используемому при вызове, т.е. все изменения с параметром влияют на указанный при вызове аргумент.
В Java используются оба эти способа: аргументы простого типа передаются по значению.
Пример:
class Test{
void meth(int i, int j){
i*=2; j/=2;
}
}
class Test1{
public static void main(String args[]){
Test ob=new Test();
int a=5; b=2;
ob.meth(a,b);
System.out.println(“a=”+a+“ b=”+b);
}
}
Все объекты передаются по ссылке, т.е. метод, получивший в качестве аргумента объект, будет ссылаться на тот аргумент, на который ссылается объект. Все изменения, сделанные в этом методе, повлияют на этот объект.
class Test{
int a,b;
Test(int i, int j){
a=i; b=j;
}
void meth(Test ob){
ob.a*=2;
ob.b/=2;
}
}
class Test1{
public static void main(String args[]){
Test ob=new Test(5,2);
ob.meth(ob);
System.out.println(“a=”+ob.a+“ b=”+ob.b);
}
}
7.
Иногда в методе необходимо сослаться на вызвавший его объект. В Java есть оператор this, который можно использовать в любом методе для ссылки на текущий объект. Иначе this всегда содержит ссылку на объект, для которого метод вызван в данный момент.
В Java нельзя объявить две одноименные локальные переменные с одни и теми же вложенными областями действия. Т.к. this позволяет ссылаться непосредственно на объект, его можно использовать для разрешения всех конфликтов иен, которые огли бы возникнуть между переменными.
class Box{
double width, height, depth;
Box(double width, double height, double depth){
this.width=width;
this.height=height;
this.depth=depth;
}
}
8.
Объем памяти выделяется динамически с помощью оператора new, поэтому возникает необходимость их уничтожать и использовать далее. В Java освобождение памяти происходит автоматически. Эта операция называется сбором мусора. Если на объект нет ссылок, то он считается ненужным и память можно освободить.
Но возникают случаи, когда при уничтожении объекту необходимо выполнить ряд действий. Для обработки таких ситуаций в Java разработан специальный механизм, который называется финализацией.
В классе можно описать метод finalize(), который будет автоматически вызываться перед удалением объекта данного класса. Он не возвращает никакого значения и имеет доступ protected. Это предотвращает доступ к данному методу всем программам, определенным за пределами данного класса.
Спецификация доступа в Java:
public означает, что к данному члену класса можно обратиться в любом месте программы;
private означает, что член класса доступен только членам этого же класса;
protected указывает, что член класса доступен внутри любого подкласса данного класса.
Если доступ не указан явно, то это означает, что он находится между public и protected.
