Перегрузка методов (конструкторов)
Использование ключевого слова this.
Структура проекта
public class Box{ //Сущность – Коробка
//поля (свойства сущности) – длина (глубина), ширина, высота коробки
private double d, w, h; //скрыты в классе
//методы-конструкторы отличаются набором параметров
// перегружаются в зависимости от параметров вызова
public Box(){d=0.0; w=0.0; h=0.0;} // без параметров
public Box(double d, double w, double h ){ // три double-параметра
this.d=d; this.w=w; this.h=h;}
// this – ссылка на объект, запустивший метод
public Box (Box ob){ //построить клон объекта ob (параметр – объект!)
d=ob.getD(); w=ob.getW(); h=ob.getH();
}
public Box (double len){ // конструктор для куба (один double-параметр)
d=w=h=len;
}
// public-интерфейс для доступа к private-полям
//public-методы-геттеры для доступа к private-полям
public double getD(){return d;}
public double getW(){return w;}
public double getH(){return h;}
// public-методы-сеттеры для доступа к private-полям
public void setD(double d){this.d=d;}
public void setW(double w){this.w=w;}
public void setH(double h){this.h=h;}
//другие полезные методы
// следующие два метода – без параметров,
// т.к. любой метод-член класса имеет доступ ко всем
// переменным-членам-класса
public double volume(){return d*w*h;} //возвращает объем
public String toString(){ //возвращает строку описания объекта
return "Box: d="+d+", w="+w+", h="+h;
}
public boolean eguals (Box box){ //сравнение (параметр – объект)
// возвращает true, если размеры запустившей
// метод коробочки (this) равны размерам
// коробочки-параметра
if (box==this) return true; // ссылки равны – одна и та же коробочка
if (d==box.getD() && w==box.getW() && h==box.getH())
return true;
else return false;
}
}
public class TestBox{
public static void main (String args[]){
//создание объектов
//демонстрируется перегрузка методов (конструкторов)
Box box1=new Box(); //создана коробочка box1
Box box2=new Box(box1); //создан клон (копия) box1
Box box3=new Box(6.2,4.5,3.9); //создана коробочка box2
Box box4=new Box(box3); //создан клон (копия) box2
Box box5=new Box(5); // кубическая коробочка box5
Box box6=new Box(box5); //создан клон box5
//Выводим данные о всех созданных коробочках
System.out.println("Первая коробочка: "+box1.toString());
System.out.println("Вторая коробочка (клон первой): "+box2.toString());
//Метод println (print, printf) использует метод
// toString() объекта по умолчанию (т.е. если он явно не указан)
System.out.println("Третья коробочка: "+box3);
System.out.println("Четвертая коробочка (клон третьей): "+box4);
System.out.println("Пятая коробочка: "+box5);
System.out.println("Шестая коробочка (клон пятой): "+box6);
// демонстрируется доступ к private-полям и
// использование метода volume()
//изменим размеры первой коробочки
//для доступа к private-полям используем методы-сеттеры
box1.setD(5.5);
box1.setW(5.5);
box1.setH(5.5);
System.out.println("Первая коробочка после изменения размеров: "
+box1);
//вычислим и выведем суммарный объем первой и третьей коробочки
double a=box1.volume()+box3.volume();
System.out.println(
"Суммарный объем первой и третьей коробочки: "+a);
//вычислим и выведем суммарную высоту первой и третьей коробочки
//для доступа к private-полям используем методы-геттеры
System.out.println(
"Суммарная высота первой и третьей коробочки: "+
(box1.getH()+box3.getH()));
//Создадим новые коробочки с другими размерами, используя
//уже определенные в программе ссылочные переменные.
//Связь с объектами, на которые эти переменные ссылались
//ранее будет потеряна, и эти объекты будут автоматически
//утилизированы "сборщиком мусора" Java
box1=new Box(6.2,4.5,3.9); //создана коробочка
box2=box1; // box1 и box2 ссылаются на одну и ту же коробочку
box3=new Box(box1); //создана еще одна коробочка - клон box1
box4=new Box(7.5); // и еще одна коробочка с другими размерами
//Выведем данные о новых коробочках
System.out.println("Созданы новые коробочки:");
System.out.println("Первая коробочка: "+box1);
System.out.println(
"Вторая коробочка, на самом деле та же, что и первая: " +box2);
System.out.println("Третья коробочка (клон первой): " +box3);
System.out.println("Четвертая коробочка: "+box4);
//сравним коробочки
// демонстрируется применение метода eguals c параметром-объектом
System.out.println("Результаты сравнения коробочек :");
System.out.println("box1==box2: "+box1.eguals(box2));
System.out.println("box1==box3: "+box3.eguals(box1));
System.out.println("box1==box4: "+box1.eguals(box4));
System.out.println("box2==box3: "+box2.eguals(box3));
System.out.println("box3==box4: "+box4.eguals(box3));
}
}
Создание объектов
Оператор Box box1=new Box();
комбинирует в себе два шага:
1) Box box1;
Создается ссылка на объект типа Box,
которой присваивается значение null, т.е.
переменная box1 пока не указывает на конкретный объект.
2) box1=new Box();
Операция new распределяет динамически (т.е. во время выполнения программы) память для объекта и возвращает ссылку на нее (адрес блока памяти).
Эта ссылка сохраняется в переменной box1.
Если символическое обозначение ссылок представить в виде конкретных адресов, может получиться примерно следующее:
Перегрузка методов (конструкторов).
Box box1=new Box();
При создании объекта для инициализации полей объекта использовался конструктор без параметров.
Box box2=new Box(6.2,4.5,3.9);
При создании объекта для инициализации полей объекта использовался конструктор с параметрами.
В Java класс может содержать несколько методов с одинаковыми именами. Эти методы обязательно должны отличаться набором параметров, иначе программа компилироваться не будет. Конкретный метод выбирается согласно набору фактических параметров, указанных в вызове метода.
Типы возвращаемых значений не проверяются при перегрузке методов (т.е. не играют никакой роли).
Пример перегрузки методов, не являющихся конструкторами приведен в проекте 10_4.
Когда вызывается перегруженный метод, Java ищет соответствие между аргументами вызова метода и его формальными параметрами. Однако, это соответствие не всегда может быть точным. В некоторых случаях определенную роль в выборе перегруженного метода могут сыграть автоматические преобразования типов Java. Пример приведен в проекте 10_5.