Как и в других языках Java поддерживает передачу параметров по значению и по ссылке. Объекты передаются по ссылке (но не объекты-обертки для примитивных типов как Integer, Short, Byte), все остальное по значению. Например, передача по значению. В вызываемом методе изменяем значение переменной. Во внешнем блоке значение переменной не меняется.
private void ChangeVariables(int a, int b){ a = a + 1; b += 1; }
int a = 10; int b = 20;
JOptionPane.showMessageDialog(null, "a = " + a + " b = " + b);
ChangeVariables(a, b);
JOptionPane.showMessageDialog(null, "a = " + a + " b = " + b);
Объекты передаются по ссылке. Так как сама объектная переменная представляет собой указатель на объект, то указатель копируется по значению, в результате чего возможно изменение объекта в методе.
private class TestObject{ private int field;
TestObject(int InitialValue){ field = InitialValue; } }
private void CnangeObject(TestObject to){ if(to != null) to.field += 1; }
TestObject to = new TestObject(10); JOptionPane.showMessageDialog(null, "to.field = " + to.field);
CnangeObject(to); JOptionPane.showMessageDialog(null, "to.field = " + to.field);
Есть категория объектов, которые являются обертками над примитивными типами - это объекты Integer, Short, Byte и другие. Казалось бы, они должны передаваться по ссылке и мы можем изменять такие объекты в методе и эти изменения сохранятся для вызываемого блока. Но на деле объекты такие передаются по значению. Я думаю, что дело тут в распаковке объекта в примитивный тип. Например:
private void ChangeVariables1(Integer a, Integer b){ a = a + 1; b += 1; }
Integer c = new Integer(10); Integer d = new Integer(20);
JOptionPane.showMessageDialog(null, "c = " + c + " d = " + d);
ChangeVariables1(c, d); JOptionPane.showMessageDialog(null, "c = " + c + " d = " + d);
Объекты могут возвращаться методами. Пример: private class Test{ int field; Test(int InitialValue){ field = InitialValue; } } private Test IncByTen(int value){ return new Test(value + 10); }
//создаем переменную и вызываем метод, который возвращает объект с полем int и значением превышающей исходную переменную на 10 int value = 10; JOptionPane.showMessageDialog(null, "value = " + value); JOptionPane.showMessageDialog(null, "value + 10 = " + IncByTen(value).field);
|