java 方法体 out 参数_Java实现OUT参数

[quote][size=medium] 在java函数中只有一种类型的返回值,但是当我们要一个函数有多个类型的返回值时,我们该怎么办呢,有办法吗,答案是肯定的,向其他语言一样使用OUT参数(就是能作为函数的输出使用的参数)。下面先看个例子,看那些参数实现了OUT功能。

[/size][/quote]

/**

*

* 这个类是用来测试Java中如何实现OUT参数。

*

* @author LoongHua

*

*/

class B{

String cnt=null;

public static void main(String[] args) {

B t=new B();//实例化一个对象

String a=null;

String[]s=new String[1];

B b=new B();

Object o=null;

t.test1(a);

System.out.println("原子类型实现的结果:"+a);

t.test2(b);

System.out.println("引用类型实现的结果:"+b.cnt);

t.test3(s);

System.out.println("数组类型实现的结果:"+s[0]);

t.test4(o);

System.out.println("数组类型实现的结果:"+String.valueOf(o));

}

public void test1(String a){

a="aaaaaaaa";

}

public void test2(B b){

b.cnt="bbbbbb";

}

public void test3(String[] s){

s[0]="sssssssss";

}

public void test4(Object o){

o="sssssssss";

}

}

运行结果:

原子类型实现的结果:null

引用类型实现的结果:bbbbbb

数组类型实现的结果:sssssssss

数组类型实现的结果:null

[quote][size=medium]

用Java写一个交换两个数的程序,这还不简单,下面是很容易写出的一个:

void swap(int a, int b) {

int temp = a;

a = b;

b = temp;

}

熟悉Java的你轻而易举的就看出了问题所在,在Java语言中,基本类型作为参数是通过传值(pass by value)的方式进行传递的,所以,这里改变的是传过来的“值”,而非我们实际的参数。

改一下我们的目标,交换两个对象,照搬上面的模式:

void swap(Object a, Object b) {

Object temp = a;

a = b;

b = temp;

}

这个方法可以正常执行吗?这是一个比较让初学者糊涂的问题。乍看之下,对象传递过来的是引用(pass by reference),改变引用的结果应该可以作用到外部。实际上,调用这个函数前后,作为实际参数的对象不会有任何改变,也就是说,这只是一个浪费时间的方法。这种pass by reference实际上也是一种pass by value,不同的是,这里的value是reference而已。所以,对传入的reference重新赋值只是对副本进行操作,而本尊没有受到任何影响。

设计方法的时候,大多数的参数是作为IN参数出现,也就是向方法传入一个值,但有时候,我们也需要参数作OUT参数——从方法内取回一个值,就像前面swap希望做的那样。如果你了解IDL(Interface Definition Language)的话,这些内容应该会让你有一丝亲切感。

在C++中,如果希望一个参数作为OUT参数,我们可能会想到指针和引用。为了让调用代码少写几个‘&’,我们可能会选择引用。

void swap(int &a, int &b) {

int temp = a;

a = b;

b = temp;

}

但到了Java中,面对这样简单的一个需求,我们却很难通过最简单的方式完成,原因上面已经说得很清楚了。难道我们只能束手就擒了吗?显然不是。虽然我们不能把引用如何,但我们仍然可以对引用指向的内容痛下狠手,于是有了这样的解决方案,提供一个对象封装类,简单起见,这里把内部成员置成了public:

class ObjectHolder {

public Object object;

}

用它改写我们的swap:

void swap(ObjectHolder a, ObjectHolder b) {

Object temp = a.object;

a.object = b.object;

b.object = temp;

}

不过调用端代码会显得复杂许多,需要把对象封装到ObjectHolder,这样执行完swap之后,ObjectHolder中所放的对象便已经是修改之后的对象。若要原有对象也受到影响,那还需要把ObjectHolder的值取出,重新给原有对象赋值。Apache的Axis就是用这种方案解决了OUT参数的问题。

Java语言从C++简化而来,一切本着简单的原则,但有些地方实在也太简单了,这样造成的结果就是有时为了完成一个简单的功能而绕很大的弯子。正是因为这样,Java语言这些年才会处于一个不断发展的过程中。也许等Java趋于完整的那一天,恐怕没有人会再以简单形容它了。

[/size][/quote]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值