Java (beginner): возвращает объект? он возвращается как постоянная ссылка или что?

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

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

Ответ 1

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

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

Ответ 2

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

a Переменная имеет значение:

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

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

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

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

поэтому в этом примере мы даем метод anyMethodYouLike Variable p... wait! мы даем Метод значение переменной (a4dfi3). Затем метод вызывает переименование этой переменной (которая по-прежнему имеет тот же адрес, что и p, поэтому она изменяет то же лицо, на которое указывает p). Итак, после метода, имя человека p указывает на, печатается, что приводит к "Гомеру".

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

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

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

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

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

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

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

Надеюсь, что смогу помочь, Ferdi265

Ответ 3

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

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

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

Ответ 4

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

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

Object obj = makeObject();

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

Ответ 5

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

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

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

4) Нет Object.copy()

5) Object.clone() - беспорядочный зверь.