2012-06-19 2 views
0
public void swap(Point var1, Point var2) 
{ 
    var1.x = 100; 
    var1.y = 100; 
    Point temp = var1; 
    var1 = var2; 
    var2 = temp; 
} 

public static void main(String [] args) 
{ 
    Point p1 = new Point(0,0); 
    Point p2 = new Point(0,0); 
    System.out.println("A: " + p1.x + " B: " +p1.y); 
    System.out.println("A: " + p2.x + " B: " +p2.y); 
    System.out.println(" "); 
    swap(p1,p2); 
    System.out.println("A: " + p1.x + " B:" + p1.y); 
    System.out.println("A: " + p2.x + " B: " +p2.y); 
} 

Запуск кода производит:Перестановка функция: Java код Pass-By-Value не удалось

A: 0 B: 0 
A: 0 B: 0 
A: 100 B: 100 
A: 0 B: 0 

Я понимаю, как функция изменяет значение p1, как он передается по значению. Что я не понимаю, почему смена p1 и p2 не удалась.

+2

Нарисуйте картинку с коробками и стрелами. 'p1' и' p2' и 'var1' и' var2' - четыре различных переменных поля. Но будут только два объекта. Когда вы прослеживаете эволюцию своего кода с картинками, и вы понимаете это правильно, вы, вероятно, будете просвещены гораздо больше, чем путем чтения текстовых описаний сценария. –

ответ

4

Java передается по значению в любое время. Это только механизм для оба примитивов и объектов.

Ключ должен знать, что передается для объектов. Это не сам объект; который живет в куче. Это ссылка на тот объект, который передается по значению.

Вы не можете изменить переданную ссылку и вернуть новое значение вызывающему, но вы можете изменить состояние объекта, к которому он относится, - если он изменен и предоставляет соответствующие методы для вызова.

Класс swap с указателями, аналогичный тому, что возможно с C, не работает, потому что вы не можете изменить то, на что ссылается ссылка, и возвращать новые значения вызывающему.

+1

+1 Пожалуйста, просмотрите эту дискуссию для более глубоких ответов http://stackoverflow.com/questions/40480/is-java-pass-by-reference – sperumal

+0

«Вы не можете изменить ссылку самостоятельно» Вы * можете * изменить ссылку на точку к другому объекту. Это то, что происходит внутри функции свопинга. Но это не изменяет ссылку в исходной функции, потому что Java передается по значению – newacct

+0

Нет, вы не можете вернуть это вызывающему. Возможно, моя формулировка не ясна; Я передумаю. – duffymo

2

Там будет копия справки генерируемой в формальном аргументе месте, так что будет новая ссылка, указывающая на экземпляры Поинт

3

myFunction() просто меняет местами ссылки на оба объекта внутри функции (которые отличаются от тех, снаружи), но делает не заменяет ссылки вне функции или самих экземпляров объекта!

0

Объекты назначаются ссылкой, а не клонированы, но аргументы остаются в качестве ссылок на фактические объекты, они не превратятся в «ссылки на ссылки».

Я имею в виду, что var1 ссылается на тот же объект, что и p1, но затем вы меняете var1 для ссылки на другой объект. Это не влияет на то, что указывает объект p1, потому что var1 НЕ является ссылкой на p1, ссылается только ссылка на тот же объект, что и p1.