Передача объектов в методы
Объекты допускается передавать методам в качестве параметров точно так же, как и примитивные значения. При этом объекты передаются по ссылке на них. Метод может изменять полученные значения. Самый важный вопрос здесь — а будут ли изменяться эти значения в вызвавшем методе? Если в метод передан объект — то будут, если же это примитивное значение — то нет. Почему так? Давайте рассмотрим на следующем примере.
Пример 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 ReturnObject < 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); >>
- Процедурное и объектно-ориентированное программирование
- Принципы ООП
- Классы и объекты
- Конструктор
- Ключевое слово this
- Перегрузка
- Стек и куча
- Java varargs
- Рекурсия
- Сборщик мусора и метод finalize
- Наследование
- Ключевое слово super
- Модификаторы доступа
- Геттеры и сеттеры
- Переопределение методов
- Абстрактные классы и методы
- Ключевое слово final
- Задания
Как передать объект в метод java
Для передачи объекта в метод необходимо объявить параметр метода, который будет принимать объект нужного типа. Например:
public void someMethod(MyObject obj) // тело метода >
В данном примере метод someMethod принимает объект класса MyObject , передаваемый в качестве аргумента метода. Чтобы передать объект в метод, необходимо создать экземпляр класса, и использовать его в качестве аргумента метода. Например:
MyObject obj = new MyObject(); someMethod(obj);
Здесь мы создали экземпляр класса MyObject и передали его в метод someMethod . Внутри метода someMethod мы можем работать с переданным объектом, вызывая его методы или обращаясь к его полям.
Как можно передать объект методу
Объекты классов, как и данные примитивных типов, могут передаваться в методы. Однако в данном случае есть одна особенность — при передаче объектов в качестве значения передается копия ссылки на область в памяти, где расположен этот объект. Рассмотрим небольшой пример. Пусть у нас есть следующий класс Person:
public class Program < public static void main(String[] args) < Person kate = new Person("Kate"); System.out.println(kate.getName()); // Kate changeName(kate); System.out.println(kate.getName()); // Alice >static void changeName(Person p) < p.setName("Alice"); >> class Person < private String name; Person(String name)< this.name = name; >public void setName(String name) < this.name = name; >public String getName() < return this.name; >>
Здесь в метод changeName передается объект Person, у которого изменяется имя. Так как в метод будет передаваться копия ссылки на область памяти, в которой находится объект Person, то переменная kate и параметр p метода changeName будут указывать на один и тот же объект в памяти. Поэтому после выполнения метода у объекта kate, который передается в метод, будет изменено имя с «Kate» на «Alice».
От этого случая следует отличать другой случай:
public class Program < public static void main(String[] args) < Person kate = new Person("Kate"); System.out.println(kate.getName()); // Kate changePerson(kate); System.out.println(kate.getName()); // Kate - изменения не произошло // kate хранит ссылку на старый объект >static void changePerson(Person p) < p = new Person("Alice"); // p указывает на новый объект p.setName("Ann"); >static void changeName(Person p) < p.setName("Alice"); >> class Person < private String name; Person(String name)< this.name = name; >public void setName(String name) < this.name = name; >public String getName() < return this.name; >>
В метод changePerson также передается копия ссылки на объект Person. Однако в самом методе мы изменяем не отдельные значения объекта, а пересоздаем объект с помощью конструктора и оператора new. В результате в памяти будет выделено новое место для нового объекта Person, и ссылка на этот объект будет привоена параметру p:
static void changePerson(Person p) < p = new Person("Alice"); // p указывает на новый объект p.setName("Ann"); // изменяется новый объект >
То есть после создания нового объекта Person параметр p и переменная kate в методе main будут хранить ссылки на разные объекты. Переменная kate, которая передавалась в метод, продолжит хранить ссылку на старый объект в памяти. Поэтому ее значение не меняется.
Возможно ли передать в метод объект до его инициализации? Java
Возможно ли организовать что-то наподобие этого, чтобы до инициализации передавался экземпляр класса OtherClass в метод method() ?
public class Main < public static void method(Object obj)< obj = new OtherClass(); //code >public static void main(String[] args) < OtherClass oc; method(oc); >>
Если нет, то как поступить в этой ситуации? Ситуация такая, в методе method содержатся switch-case конструкция и в зависимости от выбора case , создавался бы экземпляр класса через его конструктор. Конструктор там перегружен и в зависимости от case вызывалось бы так oc = new OtherClass(30, 10); либо так oc = new OtherClass(); .
