В этой статье объясняется передача параметра по значению и по ссылке в Java. Это для начального уровня, который пытается изучить основы языка Java.

Передача параметров в функцию показана ниже: мы передаем две переменные x и y в функцию с именем NumberUtil.pow.

int x = 5;
int y = 3;
System.out.println ( NumberUtil.pow (x , y) );

Код выше показывает, что значение x равно 5, значение y равно 3, и эти значения передаются в NumberUtil.pow. Функция NumberUtil.pow должна использовать эти значения, выполнять некоторые вычисления и возвращать некоторое значение. Возвращенное значение затем выводится на консоль с помощью System.out.println.

Давайте создадим класс под названием Swap с методом swap. Метод swap должен иметь два параметра. См. код ниже

package id.ststech.javabasic.passingparameter;
public class Swap {
    public static void swap ( int a, int b ) {
       // Your code goes here
   }
}

Смотрите проблему, показанную на картинке. Если у вас есть два стакана, один стакан наполнен вином, а другой наполнен свежей водой. Что вы будете делать, если я попрошу вас поменять местами оба стакана, чтобы в первом стакане была вода, а во втором — вино.

Возьмите еще один пустой стакан!

Смотрите картинку ниже

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

package id.ststech.javabasic.passingparameter;
public class Swap {
    public static void swap ( int a, int b ) {
      int c = a; // Step 1
      a = b; // Step 2
      b = c; // Step 3
    }
}

Теперь давайте попробуем использовать эту функцию в нашем основном приложении Java.

package id.ststech.javabasic.passingparameter;
public class MyApp {
    public static void main(String[] args) {
      int x = 3;
      int y = 8;
      System.out.println("Before swap");
      System.out.println("x = " + x);
      System.out.println("y = " + y);
      Swap.swap(x, y);
      System.out.println("After swap");
      System.out.println("x = " + x);
      System.out.println("y = " + y);
   }
}

При запуске приложения переменные x и y не меняются местами!

Before swap
x = 3
y = 8
After swap
x = 3
y = 8

Это все потому, что передача этого параметра вызывается по значению, то есть при передаче параметров значение, которое мы передаем, будет помещено в другую переменную как копия. Когда мы обмениваемся, копия заменяется.

В Java примитивные типы данных по умолчанию обрабатываются как передача значения параметра. Судя по картинке выше, на самом деле мы меняем местами a и b (локальные переменные, а не x и y). Вот почему переменные x и y по-прежнему имеют одно и то же значение. Если мы хотим иметь передачу параметров по ссылке, нам нужно использовать объекты вместо примитивных типов данных.

Например, мы создаем класс Number

package id.ststech.javabasic.passingparameter;
public class Number {
    private int value;
    public Number(int value) {
      super();
      this.value = value;
    }
    public int getValue() {
      return value;
    }
    public void setValue(int value) {
      this.value = value;
    }
    public String toString() {
       return String.valueOf(this.getValue());
    }
}

Затем добавьте в класс Swap новый метод с именем swapNumber.

package id.ststech.javabasic.passingparameter;
public class Swap {
    // This method is by value
    public static void swap ( int a, int b ) {
       int c = a; // Step 1
       a = b; // Step 2
       b = c; // Step 3
    }
    // This method is by reference
    public static void swapNumber ( Number a, Number b ) {
       int c = a.getValue();
       a.setValue(b.getValue());
       b.setValue(c);
    }
}

Затем добавьте код, чтобы попробовать его в main.

Number m = new Number(3);
Number n = new Number(8);
System.out.println("Before swap");
System.out.println("m = " + m);
System.out.println("n = " + n);
Swap.swapNumber(m, n);
System.out.println("After swap");
System.out.println("m = " + m);
System.out.println("n = " + n);

Запустите код и посмотрите, что изменилось.

Before swap
m = 3
n = 8
After swap
m = 8
n = 3

Вот и все. Надеюсь, это хорошо объяснено и легко понять концепцию.

Исходный код примера можно скачать здесь
https://github.com/ststechid/javabasic-passingparameter