Как использовать выходной параметр в Java?


может кто-нибудь дать мне пример кода, который использует выходной параметр в функции? Я пытался гуглить, но нашел его только в функциях. Я хочу использовать это значение в другой функции.

код, который я разрабатываю, предназначен для запуска в Android.

7 58

7 ответов:

Java проходит по значению; нет геттеры.

Java не поддерживает выходные параметры. Можно использовать возвращаемое значение или передать объект в качестве параметра и изменить объект.

в качестве обходного пути можно использовать общий "ObjectHolder". См. пример кода ниже.

пример вывода:

name: John Doe
dob:1953-12-17
name: Jim Miller
dob:1947-04-18

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

/**
 * show work around for missing call by reference in java
 */
public class OutparamTest {

 /**
  * a test class to be used as parameter
  */
 public static class Person {
   public String name;
     public String dob;
     public void show() {
      System.out.println("name: "+name+"\ndob:"+dob);
   }
 }

 /**
  * ObjectHolder (Generic ParameterWrapper)
  */
 public static class ObjectHolder<T> {
    public ObjectHolder(T param) {
     this.param=param;
    }
    public T param;
 }

 /**
  * ObjectHolder is substitute for missing "out" parameter
  */
 public static void setPersonData(ObjectHolder<Person> personHolder,String name,String dob) {
    // Holder needs to be dereferenced to get access to content
    personHolder.param=new Person();
    personHolder.param.name=name;
    personHolder.param.dob=dob;
 } 

  /**
   * show how it works
   */
  public static void main(String args[]) {
    Person jim=new Person();
    jim.name="Jim Miller";
    jim.dob="1947-04-18";
    ObjectHolder<Person> testPersonHolder=new ObjectHolder(jim);
    // modify the testPersonHolder person content by actually creating and returning
    // a new Person in the "out parameter"
    setPersonData(testPersonHolder,"John Doe","1953-12-17");
    testPersonHolder.param.show();
    jim.show();
  }
}

вы можете использовать:

  • return X. Это вернет только одно значение.

  • возвращает объект. вернет полный объект. Например, объект может содержать значения X, Y и Z.

  • передать массив. массивы передаются по ссылке. т. е. если вы передаете массив целых чисел, модифицировали массив внутри метода, то исходный код увидит изменения.

пример при прохождении Матрица.

void methodOne{
    int [] arr = {1,2,3};
    methodTwo(arr);
    ...//print arr here
}
void methodTwo(int [] arr){
    for (int i=0; i<arr.length;i++){
         arr[i]+=3;
    }
}

это выведет: 4,5,6.

оберните значение, переданное в разных классах, которые могут быть полезны для выполнения трюка, проверьте ниже для более реального примера:

  class Ref<T>{

    T s;

    public void set(T value){
        s =  value;
    }

    public T get(){
        return s;
    }

    public Ref(T value) {
        s = value;
    }
}


class Out<T>{

    T s;

    public void set(T value){
        s =  value;
    }
    public T get(){
        return s;
    }

    public Out() {
    }
}

public static void doAndChangeRefs (Ref<String> str, Ref<Integer> i, Out<String> str2){
    //refs passed .. set value
    str.set("def");
    i.set(10);

    //out param passed as null .. instantiate and set 
    str2 = new Out<String>();
    str2.set("hello world");
}
public static void main(String args[]) {
        Ref<Integer>  iRef = new Ref<Integer>(11);
        Out<String> strOut = null; 
        doAndChangeRefs(new Ref<String>("test"), iRef, strOut);
        System.out.println(iRef.get());
        System.out.println(strOut.get());

    }

Это не точно ---> "...* пройти массив. массивы передаются по ссылке. т. е. если вы передаете массив целых чисел, измените массив внутри метода.

каждый тип параметра передается по значению в Java. Массивы объекта, его ссылка на объект передается по значению.

Это включает в себя массив примитивов (int, double,..) и объекты. Целое число стоимостью изменена операция methodtwo (), но это все равно один и тот же объект Арр ссылку, операция methodtwo() невозможно добавить или удалить элемент массива. methodTwo () также не может создать новый массив, а затем установить этот новый массив в arr. Если вы действительно можете передать массив по ссылке, вы можете заменить этот arr совершенно новым массивом целых чисел.

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

спасибо. Я использую передачу объекта в качестве параметра. Мой Android код ниже

    String oPerson= null;
    if (CheckAddress("5556", oPerson))
    {
        Toast.makeText(this, 
                "It's Match! " + oPerson,                   
                Toast.LENGTH_LONG).show();
    }

    private boolean CheckAddress(String iAddress, String oPerson)
{
    Cursor cAddress = mDbHelper.getAllContacts();
    String address = "";        
    if (cAddress.getCount() > 0) {
        cAddress.moveToFirst();
        while (cAddress.isAfterLast() == false) {
            address = cAddress.getString(2).toString();
            oPerson = cAddress.getString(1).toString(); 
            if(iAddress.indexOf(address) != -1)
            {
                Toast.makeText(this, 
                        "Person : " + oPerson,                  
                        Toast.LENGTH_LONG).show();
                System.out.println(oPerson);
                cAddress.close();
                return true;                    
            }
            else cAddress.moveToNext();
        }
    }
    cAddress.close();
    return false;
}

результат

Человек : Джон

это матч! null

на самом деле, "это матч! Джон"

пожалуйста, проверьте свою ошибку.