Передача объектов в методы
Объекты допускается передавать методам в качестве параметров точно так же, как и примитивные значения. При этом объекты передаются по ссылке на них. Метод может изменять полученные значения. Самый важный вопрос здесь - а будут ли изменяться эти значения в вызвавшем методе? Если в метод передан объект - то будут, если же это примитивное значение - то нет. Почему так? Давайте рассмотрим на следующем примере.
Пример 1. Изменение переданных значений в методе
При запуске программы в стеке выделяется область памяти для метода main(). Там хранятся локальные переменные x и y. При вызове метода changePrimitives() в стеке выделяется еще одна область памяти, в которой создаются локальные переменные, а и b. Их значения хранятся там же. Если, а и b изменяются, это никак не влияет на переменные x и y - они хранятся в разных областях памяти.
Локальная объектная переменная box создается в стековой области памяти метода main(), но сам объект создается в куче. При вызове метода changeObject() передается не сам объект, а ссылка на него. Поэтому при изменении переменной о, в методе changeObject(), меняется объект находящийся куче. И эти изменения, естественно, видны в вызвавшем методе main():
public class Box {
double width;
double height;
double depth;
Box(double w, double h, double d) {
width = w;
height = h;
depth = d;
}
}
public class TestDemo {
/**
* Изменение объекта
*
* @param box
*/
static void changeObject(Box box) {
box.width *= 2;
box.height /= 2;
box.depth += 2;
}
/**
* Изменение примитивных типов
*
* @param a
* @param b
*/
static void changePrimitives(int a, int b) {
a *= 2;
b /= 2;
}
public static void main(String[] args) {
Box box = new Box(5, 6, 7);
int x = 10;
int y = 10;
System.out.println("x и y перед вызовом: " + x + " " + y);
changePrimitives(x, y);
System.out.println("x и y после вызова: " + x + " " + y);
System.out.println("box перед вызовом: " + box.width + " " + box.height + " " + box.depth);
changeObject(box);
System.out.println("box после вызова: " + box.width + " " + box.height + " " + box.depth);
}
}
Результат выполнения:
x и y перед вызовом: 10 10
x и y после вызова: 10 10
box перед вызовом: 5.0 6.0 7.0
box после вызова: 10.0 3.0 9.0
Объекты можно создавать в методе и возвращать их. Например, как показано в следующем примере:
Пример 2. Возврат объекта из метода
public class ReturnObjectExample {
int a;
ReturnObject(int i) {
a = i;
}
ReturnObject incrementByTen() {
ReturnObject temp = new ReturnObject(a + 10);
return temp;
}
public static void main(String[] args) {
ReturnObject ob1 = new ReturnObject(2);
ReturnObject ob2 = ob1.incrementByTen();
System.out.println("ob1.a: " + ob1.a);
System.out.println("ob2.a: " + ob2.a);
}
}
Курс 'Java для начинающих' на Udemy
Зарегистрируйтесь или войдите, чтобы иметь возможность оставить комментарий.