2012-02-23 2 views
2

Я пытаюсь создать litle gam для Android-телефонов. У меня много единиц, и у всех есть места. Для вычисления адресата я использую функцию под названием CalDes. Эта функция CalDes вычисляет скорость моего устройства. Поэтому я отправляю некоторые переменные, в которые я должен редактировать и снова использовать их. Для этого я должен отправить эти переменные со ссылкой. Вот простой для C++. Как это сделать в java?Передать по ссылке в java?

void swap(SomeType& arg1, Sometype& arg2) { 
    SomeType temp = arg1; 
    arg1 = arg2; 
    arg2 = temp; 
} 
... 
SomeType var1 = ...; // value "A" 
SomeType var2 = ...; // value "B" 
swap(var1, var2); // swaps their values! 
+0

Что означает, что в Java нет ссылки на ссылку? В Java каждый аргумент передается по ссылке, кроме собственных типов (int, long, byte, boolean, double и float). – Fred

+2

О мальчик. Никакая другая java «не проходит по значению/проходит по ссылке». Кроме того, java - это пропуск по значению! – Umair

+0

Есть масса существующих вопросов по этой теме, пожалуйста, ищите перед публикацией. – DNA

ответ

12

У Java нет пропущенных ссылок вообще. У вас есть несколько вариантов:

  1. передают данные в виде массива:

    void swap(SomeType[] args) { 
        SomeType temp = args[0]; 
        args[0] = args[1]; 
        args[1] = temp; 
    } 
    

    ... но используя это боль в вызывающем коде:

    SomeType a = ...; 
    SomeType b = ...; 
    SomeType[] args = new SomeType[] { a, b }; 
    swap(args); 
    a = args[0]; 
    b = args[1]; 
    
  2. Создайте объект с общедоступными SomeType членами и передайте ссылку на объект.

    void swap(SomeTypeContainer c) { 
        SomeType temp = c.a; 
        c.a = c.b; 
        c.b = temp; 
    } 
    

    Что очень похоже на # 1, но, вероятно, более удобно работать с кодом вызова.

    SomeTypeContainer c = new SomeTypeContainer(/* ... something that creates a and b ... */); 
    // Use c.a and c.b directly 
    swap(c); 
    // Use c.a and c.b directly, they're now swapped 
    
+1

Благодарим вас за отличное объяснение. –

1

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

+1

Не совсем - см. Http://stackoverflow.com/questions/40480/is-java-pass-by-reference – DNA

+1

@ ДНА: Ну, это --- как много вещей --- вопрос перспективы. Если мы говорим о ссылках, то Java передается по значению. Если мы говорим об объектах, то они передаются по ссылке. Подход Java к прохождению отличается от большинства других предшествующих языков. Вы не можете решить, как передать значение или объект. Невозможно передать объект по значению в Java. И вы не можете передать примитивный тип по ссылке в Java. Вот почему существуют такие типы, как java.lang.Integer, et. и др. И вы не можете передать ссылку на ссылку. Это то, о чем просит ОП. – jmg

+1

@jmg: Ключевым моментом здесь является то, что «pass-by-reference» - это конкретный термин: это означает передачу ссылки * в ** переменную ** в вызывающем контексте * в вызываемый контекст, поэтому вызываемый контекст может изменять содержимое переменной контекста вызывающего контекста. Абсолютно ничего общего с объектными ссылками. Java полностью передается по значению. Передача ** значения **, в случае объектов, является ссылкой на объект, но это не имеет ничего общего с передачей по ссылке. –

Смежные вопросы