如何在Java中使用输出参数?

有人可以请给我一些示例代码,在函数中使用输出参数? 我试图谷歌它,但只是在function中发现它。 我想在另一个函数中使用这个输出值。

我正在开发的代码旨在在Android中运行。

Java通过价值传递; 没有像C#中的out参数。

您可以使用return ,也可以改变作为参考传递的对象( 值)。

相关问题

  • Java有类似C#的ref和out关键字吗? ? (没有!)
  • Java通过引用传递? (没有!)

代码示例

 public class FunctionSample { static String fReturn() { return "Hello!"; } static void fArgNoWorkie(String s) { s = "What am I doing???"; // Doesn't "work"! Java passes by value! } static void fMutate(StringBuilder sb) { sb.append("Here you go!"); } public static void main(String[] args) { String s = null; s = fReturn(); System.out.println(s); // prints "Hello!" fArgNoWorkie(s); System.out.println(s); // prints "Hello!" StringBuilder sb = new StringBuilder(); fMutate(sb); s = sb.toString(); System.out.println(s); // prints "Here you go!" } } 

也可以看看

  • 什么是不可改变的?
  • Java中的StringBuilder和StringBuffer

至于OP需要帮助的代码 ,下面是一个使用特殊值(通常为null用于引用types)的典型解决scheme来指示成功/失败:

代替:

 String oPerson= null; if (CheckAddress("5556", oPerson)) { print(oPerson); // DOESN'T "WORK"! Java passes by value; String is immutable! } private boolean CheckAddress(String iAddress, String oPerson) { // on search succeeded: oPerson = something; // DOESN'T "WORK"! return true; : // on search failed: return false; } 

改用String返回types,用null表示失败。

 String person = checkAddress("5556"); if (person != null) { print(person); } private String checkAddress(String address) { // on search succeeded: return something; : // on search failed: return null; } 

这就是java.io.BufferedReader.readLine()工作方式,例如:它返回instanceof String (也许是一个空string!),直到它返回null来表示“search”结束。

当然,这并不限于引用types的返回值。 关键是必须有一些特殊的价值永远不是一个有效的价值,你用这个价值的特殊用途。

另一个经典的例子是String.indexOf :它返回-1来表示search失败。

注意 :因为Java没有“input”和“输出”参数的概念,所以使用i-o-前缀(例如iAddressoPerson )是不必要和单一的。


更一般的解决scheme

如果您需要返回多个值,通常它们以某种方式相关(例如,单个Point xy坐标)。 最好的解决scheme是将这些值封装在一起。 人们使用了一个Object[]或一个List<Object> ,或者一个普通的Pair<T1,T2> ,但是真的,你自己的types是最好的。

对于这个问题,我推荐一个像这样的不可变的SearchResulttypes来封装booleanStringsearch结果:

 public class SearchResult { public final String name; public final boolean isFound; public SearchResult(String name, boolean isFound) { this.name = name; this.isFound = isFound; } } 

然后在你的searchfunction中,你可以做到以下几点:

 private SearchResult checkAddress(String address) { // on address search succeed return new SearchResult(foundName, true); : // on address search failed return new SearchResult(null, false); } 

然后你这样使用它:

 SearchResult sr = checkAddress("5556"); if (sr.isFound) { String name = sr.name; //... } 

如果你愿意,你可以(也可能应该)使final不可变字段不public ,并使用public getter。

Java不支持输出参数。 您可以使用返回值,或传入一个对象作为参数并修改该对象。

作为解决方法,可以使用通用的“ObjectHolder”。 看下面的代码示例。

示例输出是:

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

所以Person参数已被修改,因为它被包装在按值传递的Holder中 – 通用参数里面是可以修改内容的引用 – 所以实际上返回一个不同的人,原始的原样保持原样。

 /** * 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(); } } 

你可以使用:

  • 返回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()); } 

这是不准确的—>“… *传递数组。数组是通过引用传递的,即如果传递整数数组,则修改方法内的数组。

每个参数types都是通过Java传递的。 数组是对象,它的对象引用是通过值传递的。

这包括一系列基元(int,double,..)和对象。 这个整数值是通过methodTwo()改变的,但它仍然是相同的arr对象引用,methodTwo()不能添加数组元素或删除数组元素。 methodTwo()也不能,创build一个新的数组,然后将这个新的数组设置为arr。 如果你真的可以通过引用传递一个数组,你可以用一个全新的整数数组replace这个arr。

在Java中作为parameter passing的每个对象都是按值传递的,没有例外。

谢谢。 我使用传入一个对象作为参数。 我的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; } 

结果是

人:约翰

这是匹配! 空值

事实上,“这是匹配!约翰”

请检查我的错误。