Способы передачи аргументов

В программировании есть два понятия: передача в подпрограмму аргумента по ссылке и по значению.

При передаче по значению – аргумент копируется в формальный параметр подпрограммы. Следовательно, если параметр изменяет свое значение в подпрограмме, то изменение аргумента происходить не будет.

При передаче по ссылке – параметру передается ссылка на аргумент (а не его значение). Внутри подпрограммы эта ссылка используется для обращения к реальному аргументу, указанному в вызове. Это означает, что изменения, выполненные в параметре, будут влиять на аргумент, использованный в вызове подпрограммы.

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

В случае, когда аргумент – примитивный тип, передача по значению означает то, что метод не может изменить оригинальное значение аргумента в программе. Рассмотрим пример.

class MyClass{

static void add(int i){

i+=4;

}

public static void main (String[] args)

{

int i=10;

System.out.println("i перед вызовом:"+i);

add(i);

System.out.println("i после вызова:"+i);

} }

Результат

i перед вызовом:10

i после вызова:10

Как видите, выполняемые внутри метода add() операции не влияют на значение переменной i, оно не изменилось после вызова метода.

Когда же аргумент – ссылка на объект, при передаче этой ссылки методу, принимающий ее параметр будет ссылаться на тот же объект, на который ссылается аргумент. По сути, это означает, что объекты передаются так, как если бы они передавались методам по ссылке. Изменения объекта внутри метода влияют на объект, использованный в качестве аргумента. Рассмотрим несколько примеров передачи аргументов ссылочного типа.

class MyClass{

static void add(int[] a){

for(int i=0;i<a.length;i++)

if (a[i]>0) a[i]=0;

}

public static void main (String[] args){

int [] m={1,2,-3,0,-4};

System.out.println("Массив перед вызовом метода:");

for(int x: m) System.out.printf("%3d",x);

System.out.println();

add(m);

System.out.println("Массив после вызова метода:");

for(int x: m) System.out.printf("%3d",x);

} }


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: