#java
#java
Вопрос:
Давайте рассмотрим следующий код на Java.
package obj;
final class First
{
public int x;
public First(int x)
{
this.x=x;
}
}
final class Second
{
public Second(First o)
{
o.x=10;
}
}
final public class Main
{
public static void main(String[] args)
{
First f=new First(50);
Second s=new Second(f);
System.out.println("x = " f.x);
}
}
В приведенном выше коде мы вводим значение 50 с помощью инструкции, First f=new First(50);
которая присваивается члену класса x типа int в теле конструктора в первом классе.
В классе Second объект f класса First передается с помощью инструкции Second s=new Second(f); и мы изменяем значение переменной экземпляра x, хранящейся в этом объекте, на 10, что повлияет на исходный объект f, потому что в Java объекты всегда передаются по ссылке, а не по значению.
В некоторых конкретных ситуациях может оказаться критичным не допускать таких изменений в исходных объектах. Есть ли в Java какой-либо механизм, который может позволить нам предотвратить такие модификации? (это могло бы позволить нам передавать объекты по значению)
Ответ №1:
Нет, объект вообще не передается в Second
. Ссылка передается по значению.
Java всегда использует передачу по значению, но значением любого выражения всегда является только примитивный тип или ссылка — никогда объект.
Звучит так, как будто вы хотите создать копию существующего объекта, а затем передать ссылку на этот новый объект методу (по значению). То, что представляет собой «копию», будет зависеть от данных в классе. (Возможно, вам удастся отделаться поверхностным копированием, или вам может понадобиться углубиться и т.д.)
Комментарии:
1. Вероятно, также стоит упомянуть, что большинство базовых системных классов будут создавать только неглубокие копии, поэтому для создания глубокой копии списка вам нужно будет создать новый список, а затем выполнить итерацию по исходному списку, создавая глубокие копии содержимого
Ответ №2:
Нет, их нет. Я бы сказал, что ваш пример не очень хороший: если вы хотите убедиться, что что-то не меняется, не предоставляйте способы это изменить. Последующая потеря изменений в лучшем случае вводит в заблуждение.
Ответ №3:
First f=new First(50);
Second s=new Second(f);
в первой строке вы создаете ссылочную переменную типа Object First
, а во 2-й строке она передается в Class Second
Итак, как говорит Джон Скит в java «Java всегда использует передачу по значению, но значением любого выражения всегда является только примитивный тип или ссылка — никогда объект».
И если, если вы не хотите изменять значение свойства, тогда вам необходимо передать новый объект класса First
Потому что, если у вас есть ссылка на какой-либо класс, вы можете изменить свойство этого класса ..
Или вы можете создать копию этого объекта, которая в конце создает новый объект First Class