При вызове метода формальным параметрам присваивается значение фактических параметров:
class Letter {
char c;
}
public class PassObject {
static void f (Letter y) {
y.c = ’z’;
}
public static void main (String[] args) {
Letter x = new Letter();
x.c = ’a’;
System.out.println (“1:x.c: ” + x.c);
f(x); // формальному параметру y присвоится значение фактического х
System.out.println (“2:x.c: ” + x.c);//изменилось поле объекта х!!!!!
}
}
Ссылки на y и x стали указывать на один и тот же объект. Т.е. после вызова метода объект х изменился!!!!!
Объекты фактически предаются по ссылке, т.е. передается копия ссылки- методы могут изменять объекты-параметры.
Примитивы передаются по значению, т.е. передается копия значения - методы не могут изменять примитивы-параметры.
Проверка объектов на равенство
Операторы = = и!= для объектов сравнивают ссылки.
Нельзя установить ими равенство содержимого объектов.
public class Equivalence {
public static void main (String[] args){
Integer n1 = new Integer (47);
Integer n2 = new Integer (47);
System.out.println (n1 == n2); // false
System.out.println (n1!= n2); // true
}
}
Содержимое объектов сравнивается методом equals(). Это метод класса Object.
System.out.println(n1.equals(n2)); //true
В библиотечных классах он реализован (переопределен). В собственных классах наследуется от Object, сравнивает ссылки, его нужно переопределять самому разработчику.