Java (начинающий): возвращение объекта?это возвращается как постоянная ссылка или как? - PullRequest
10 голосов
/ 17 ноября 2010

У меня есть функция, которая возвращает определенный пользователем объект. Сначала я хочу узнать, возвращен ли этот объект по ссылке и что если он был закрытым?

Кроме того, как мне вернуть его как постоянную (окончательную) ссылку, потому что я не хочу, чтобы кто-то связывался с этим? Я так запутался между возвратом объекта и возвратом object.copy (); или object.clone ();

Ответы [ 5 ]

14 голосов
/ 17 ноября 2010

В Java вы всегда возвращаете ссылку (если только возвращаемое значение не является примитивным типом, таким как int, float, char, ...).

Итак, если вы не хотите, чтобы возвращаемый объект был изменен, вы должны вернуть его полную копию (вы можете использовать интерфейс Clonable и метод clone, если ваш класс определяет его ).

10 голосов
/ 24 февраля 2013

Итак, чтобы ответить на ваши вопросы, вы сначала должны знать, как Java передает переменные.

переменная имеет значение:

int i = 1234;
Person p = new Person("Peter");

Теперь переменная i содержит ровно 1234,в то время как переменная p содержит адрес памяти созданного персонажа.

, поэтому в i содержится 1234, а p содержит адрес (скажем, a4dfi3).

anyMethodYouLike(p);
System.out.println(p.getName());
public void anyMethodYouLike(Person somePerson) {
   somePerson.rename("Homer");
}

, поэтому в этом примере мы даемМетод anyMethodYouLike Переменная p ... подождите!мы даем методу значение переменной (a4dfi3).Затем метод вызывает метод переименования для этой переменной (которая по-прежнему имеет тот же адрес, что и p, поэтому он изменяет тот же объект Person, на который указывает p).Итак, после того, как Метод, Имя Человека, на которое указывает р, печатается, в результате получается «Гомер».

someOtherMethod(p);
System.out.println(p.getName());
public void someOtherMethod(Person somePerson) {
   somePerson = new Person("Walter");
}

В ЭТОМ примере мы все еще даем адрес нашего Человека, называемого «Петр»,метод.Но на этот раз Метод создает нового Person в somePerson (поэтому переопределяет адрес в somePerson на ... скажем, 13n37s. НО! Человек в a4dfi3 не изменился! При вызове print по-прежнему выводится "Peter", а не "Walter".

Теперь давайте посмотрим, как это происходит с примитивами:

someMethod(i);
System.out.println(i);
public void someMethod(int someInt) {
   someInt++;
}

Итак, значение i (1234) передается someInteger. Затем someInteger увеличивается до 1235. Но япо-прежнему 1234.

Это большая разница между объектами и примитивами в Java.

Теперь к вашим вопросам: 1. Как вы можете прочитать здесь, да, Java всегда передает ссылочный адрес объекта2. Если вы не хотите, чтобы кто-то связывался со значениями ваших объектов, вы должны сначала создать новый объект с этой информацией (например, с помощью Cloneable и clone ()), но это настоящий беспорядок, потому что вы должны сделатьуверен, что все в вашем Объекте, которое не является примитивным, воссоздается, что просто ужасно, когда у вас есть огромные древовидные структуры Объектов.

Я надеюсь, что смогуСправка, Ferdi265

2 голосов
/ 25 февраля 2013

Что вы действительно должны понять, так это то, что нет ничего особенного в «прохождении» или «возвращении». Всякий раз, когда вы «пропускаете» или «возвращаете» что-то, оно просто передает ценность вещи. Период. Для любого типа. Всякий раз, когда вы «пропускаете» или «возвращаете» что-то, это все равно, что просто присвоить это переменной.

Однако, какова ценность вещи, которую вы передаете или возвращаете? Вот где, кажется, твое замешательство. Ваш вопрос спрашивает о «возврате предмета»; однако такая вещь не имеет смысла в Java. Объекты не являются значениями в Java. Невозможно иметь переменную, значение которой является объектом.

Единственными типами в Java являются примитивные типы и ссылочные типы. Следовательно, единственными значениями являются примитивы и ссылки. (Ссылки являются указателями на объекты.) В Java мы манипулируем объектами только через ссылки (указатели на объекты). Мы не можем хранить объект в переменной; но мы можем хранить ссылку (указатель на объект) в переменной. Поэтому, когда вы говорите о передаче или возврате объектов, вы почти наверняка говорите о передаче или возврате ссылок. И, как уже было сказано, в передаче или возврате ссылок нет ничего особенного - значение ссылки (указатель) передается или возвращается.

1 голос
/ 17 ноября 2010

Возвращает ссылку на объект.

скажем, предположим, что у вас есть вызов метода типа.

Object obj = makeObject();

, который создает объект и возвращает (который является ссылкой на объект, созданный вметод makeObject).

0 голосов
/ 17 ноября 2010

1) Да, он возвращает ссылку на объект.

2) Если метод закрытый, то его можно вызывать только из самого класса.

3) Созданиеобъект final не мешает другим вызывать на нем методы.Есть способы сделать объект неизменным, используя пакеты и методы видимости.(Посмотрите, как общественная, защищенная и частная работа)

4) Нет Object.copy()

5) Object.clone() грязный зверь.

...