Могут ли объекты передаваться по значению, а не по ссылке в Java?

#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