Использование объектов в качестве параметров

До сих пор в качестве параметров методов мы использовали только простые типы. Однако передача методам объектов — и вполне допустима, и достаточно распространена. Например, рассмотрим следующую короткую программу:

// Методам можно передавать объекты. class Test { int a, b;
Test(int i, int j) {
a = i;
b = j;
}
// возврат значения true, если параметр о равен вызывающему объекту
boolean equals(Test о) {
if(о.а == а && o.b == b) return true;
else return false;
class PassOb {
public static void main(String args[]) {
Test obi = new Test(100, 22);
Test ob2 = new Test(100, 22);
Test ob3 = new Test(-1, -lb-System, out .println ("obi == ob2: " + obi.equals(ob2) ) ;
System.out.println("obi == ob3 : " + obi.equals(ob3));
}
}

Эта программа создает следующий вывод:

obi == ob2: true
obi == оЬЗ: false

Как видите, метод equals () внутри метода Test проверяет равенство двух объектов и возвращает результат этой проверки. То есть он сравнивает вызывающий объект с тем, который был ему передан. Если они содержат одинаковые значения, метод возвращает значение true. В противном случае он возвращает значение false. Обратите внимание, что параметр о в методе equals () указывает Test в качестве типа. Хотя Test — тип класса, созданный программой, он используется совершенно так же, как встроенные типы Java.

Одно из наиболее часто встречающихся применений объектов-параметров — в конструкторах. Часто приходится создавать новый объект так, чтобы вначале он не отличался от какого-то существующего объекта. Для этого потребуется определить конструктор, который в качестве параметра принимает объект его класса. Например, следующая версия класса Box позволяет выполнять инициализацию одного объекта другим:

//В этой версии Box допускает инициализацию одного объекта другим.
class Box {
double width;
double height;
double depth;
// Обратите внимание на этот конструктор. Он использует объект типа Во:
Box(Box ob) { // передача объекта конструктору
width = ob.width;
height = ob.height;
depth = ob.depth;
}
// конструктор, используемый при указании всех измерений
Box(double w, double h, double d) {
width = w;
height = h;
depth = d;
}
// конструктор, используемый, если ни одно из изменений не указано
Box () {
width = -1; // значение -1 используется для указания
height = -1; //не инициализированного
depth = -1; // параллелепипеда
}
// конструктор, используемый при создании куба
Box(double len) {
width = height = depth = len;
}
// вычисление и возврат объема
double volume () {
return width * height * depth;
}
}
class 0verloadCons2 {
public static void main(String args[]) {
// создание параллелепипедов с применением различных конструкторов
Box myboxl = new Box(10, 20, 15);
Box mybox2 = new Box() ;
Box mycube = new Box (7) ;
Box myclone = new Box(myboxl) ; // создание копии объекта
myboxl double vol;
// получение объема первого параллелепипеда
vol = myboxl.volume () ;
System.out.println("Объем myboxl равен " + vol);
// получение объема второго параллелепипеда
vol = mybox2.volume();
System.out.println("Объем mybox2 равен " + vol);
// получение объема куба
vol = mycube.volume О ;
System.out.println("Объем куба равен " + vol);
// получение объема клона
vol = myclone.volume О;
System.out.println("Объем клона равен " + vol);
}
}

Как вы убедитесь, приступив к созданию собственных классов, чтобы объекты можно было конструировать удобным и эффективным образом, нужно располагать множеством форм конструкторов.