如何在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-
前缀(例如iAddress
,oPerson
)是不必要和单一的。
更一般的解决scheme
如果您需要返回多个值,通常它们以某种方式相关(例如,单个Point
x
和y
坐标)。 最好的解决scheme是将这些值封装在一起。 人们使用了一个Object[]
或一个List<Object>
,或者一个普通的Pair<T1,T2>
,但是真的,你自己的types是最好的。
对于这个问题,我推荐一个像这样的不可变的SearchResult
types来封装boolean
和String
search结果:
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; }
结果是
人:约翰
这是匹配! 空值
事实上,“这是匹配!约翰”
请检查我的错误。