Java строго передается по значению!

Опубликовано: 15 Февраля, 2022

Consider the following Java program that passes a primitive type to function.

public class Main
{
    public static void main(String[] args)
    {
        int x = 5;
        change(x);
        System.out.println(x);
    }
    public static void change(int x)
    {
        x = 10;
    }
}

Выход:

 5

Мы передаем int в функцию change (), и в результате изменение значения этого целого числа не отражается в основном методе. Как и C / C ++, Java создает копию переменной, передаваемой в метод, а затем выполняет манипуляции. Следовательно, изменение не отражено в основном методе.

Как насчет объектов или ссылок?

В Java все примитивы, такие как int, char и т. Д., Аналогичны C / C ++, но все непримитивы (или объекты любого класса) всегда являются ссылками. Таким образом, когда мы передаем объектные ссылки в методы, становится сложно. Java создает копию ссылок и передает ее методу, но они по-прежнему указывают на ту же ссылку в памяти. Означает, что если установить какой-либо другой объект для ссылки, переданной внутри метода, объект из вызывающего метода, а также его ссылка останется неизменной.

The changes are not reflected back if we change the object itself to refer some other location or object
If we assign reference to some other location, then changes are not reflected back in main().

// A Java program to show that references are also passed
// by value.
class Test
{
    int x;
    Test(int i) { x = i; }
    Test()      { x = 0; }
}
  
class Main
{
    public static void main(String[] args)
    {
        // t is a reference
        Test t = new Test(5);
  
        // Reference is passed and a copy of reference
        // is created in change()
        change(t);
  
        // Old value of t.x is printed
        System.out.println(t.x);
    }
    public static void change(Test t)
    {
        // We changed reference to refer some other location
        // now any changes made to reference are not reflected
        // back in main
        t = new Test();
  
        t.x = 10;
    }
}

Выход:

 5

Changes are reflected back if we do not assign reference to a new location or object:
If we do not change the reference to refer some other object (or memory location), we can make changes to the members and these changes are reflected back.

// A Java program to show that we can change members using using
// reference if we do not change the reference itself.
class Test
{
    int x;
    Test(int i) { x = i; }
    Test()      { x = 0; }
}
  
class Main
{
    public static void main(String[] args)
    {
        // t is a reference
        Test t = new Test(5);
  
        // Reference is passed and a copy of reference
        // is created in change()
        change(t);
  
        // New value of x is printed
        System.out.println(t.x);
    }
  
    // This change() doesn"t change the reference, it only
    // changes member of object referred by reference
    public static void change(Test t)
    {
        t.x = 10;
    }
}

Выход:

 10


Exercise: Predict the output of following Java program

//  Test.java
class Main {
   // swap() doesn"t swap i and j
   public static void swap(Integer i, Integer j) 
   {
      Integer temp = new Integer(i);
      i = j;
      j = temp;
   }
   public static void main(String[] args) 
   {
      Integer i = new Integer(10);
      Integer j = new Integer(20);
      swap(i, j);
      System.out.println("i = " + i + ", j = " + j);
   }
}

Эта статья предоставлена Пранджалом Матхуром . Если вам нравится GeeksforGeeks, и вы хотели бы внести свой вклад, вы также можете написать статью и отправить ее по электронной почте на deposit@geeksforgeeks.org. Посмотрите, как ваша статья появляется на главной странице GeeksforGeeks, и помогите другим гикам.

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше

Вниманию читателя! Не переставай учиться сейчас. Ознакомьтесь со всеми важными концепциями Java Foundation и коллекций с помощью курса "Основы Java и Java Collections" по доступной для студентов цене и будьте готовы к работе в отрасли. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .