Перегрузка методов (конструкторов)

Использование ключевого слова this.

Структура проекта

Перегрузка методов (конструкторов) - student2.ru

 
  Перегрузка методов (конструкторов) - student2.ru

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.

Перегрузка методов (конструкторов) - student2.ru

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

Перегрузка методов (конструкторов) - student2.ru

Перегрузка методов (конструкторов).

Box box1=new Box();

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

Box box2=new Box(6.2,4.5,3.9);

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

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

Типы возвращаемых значений не проверяются при перегрузке методов (т.е. не играют никакой роли).

Пример перегрузки методов, не являющихся конструкторами приведен в проекте 10_4.

Когда вызывается перегруженный метод, Java ищет соответствие между аргументами вызова метода и его формальными параметрами. Однако, это соответствие не всегда может быть точным. В некоторых случаях определенную роль в выборе перегруженного метода могут сыграть автоматические преобразования типов Java. Пример приведен в проекте 10_5.

Наши рекомендации