`
沙漠绿树
  • 浏览: 429627 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java实现OUT参数

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


/**
 * 
 * 这个类是用来测试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

引用

用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趋于完整的那一天,恐怕没有人会再以简单形容它了。

3
0
分享到:
评论
4 楼 沙漠绿树 2014-08-11  
yanwushu 写道
学习java也有两年了, 但是一直没有注意到参数传递的这个问题,挺惭愧的。
建议楼主在详细解释下什么叫做按值传递。不然传递object的那一段还是不容一定懂。



请看下面的代码及注释:

public class T
{
    public void test(TT a, TT b)
    {
        TT c = a;
        a = b;
        b = c;
    }

    public void test(TT a, RR b)
    {
        a.a = 11;
        b.b = 22;
    }

    public static void main(String[] args)
    {
        TT a = new TT();
        a.a = 4;

        TT b = new TT();
        b.a = 6;

        T t = new T();
        t.test(a, b);
        //这里打印的:4   6;如果不是传值引用则是:6   4
        System.out.println(a.a + "\t" + b.a);

        RR r = new RR();
        t.test(a, r);
        //这里打印:11   22;体现了out参数,a和r对象属性的值被方法改变,会影响外部使用其属性,变通的成为了out参数。
        System.out.println(a.a + "\t" + r.b);
    }
}

class TT
{
    int a = 2;
}

class RR
{
    int b = 1;
}
3 楼 yanwushu 2014-07-31  
学习java也有两年了, 但是一直没有注意到参数传递的这个问题,挺惭愧的。
建议楼主在详细解释下什么叫做按值传递。不然传递object的那一段还是不容一定懂。
2 楼 avi9111 2011-10-26  
写了5年程序,只是在笔试的时候会碰到这个问题

还真没碰到这种需求,要换了2个数据的
   void swap(int &a, int &b) {
        int temp = a;
        a = b;
        b = temp;
    }

第一,真的没这种应用需求
第二,自己不好控制, 到底换了没,怎么判断,DEBUG?LOG?
第三,人家接手改你程序,也太难了吧,谁看的懂
1 楼 lancezhcj 2010-12-04  
肯钻研,而且文笔很好

相关推荐

    java实现七参数转换功能

    总之,Java实现七参数转换功能涉及到坐标转换理论、数学运算和编程技巧,通过"SevenParamsDemo"这样的实践项目,开发者可以深入理解并应用这一技术。在实际工作中,这样的转换功能对于地理信息系统的精度和实用性至...

    java调用存储过程(含out参数)

    Java中调用存储过程主要通过JDBC(Java Database Connectivity)接口实现。以下是一步步的操作步骤: 1. **加载数据库驱动**:首先,确保已添加对应数据库的JDBC驱动库到项目类路径中,如MySQL的`mysql-connector-...

    java实现多层嵌套循环参数转换

    在Java编程中,多层嵌套循环...综上所述,Java实现多层嵌套循环、参数转换以及父子级结构的操作是软件开发中常见的任务,尤其在数据处理和数据库交互中。理解并熟练掌握这些技能,对于提高编程效率和代码质量至关重要。

    java可变参数

    下面我们将详细探讨Java可变参数的概念、用法以及背后的实现原理。 ### 1. 概念与语法 Java可变参数在声明时以`...`(三个点)作为后缀,它实际上是一个数组的语法糖。例如,我们可以定义一个接受任意数量整数的...

    用传参数的方法实现Java对SQLite的添加和查询

    本文将详细介绍如何通过传递参数的方法实现对SQLite数据库的添加和查询操作,避免直接拼接SQL语句,从而提高代码的安全性和可读性。 首先,确保你的项目已经引入了SQLite的JDBC驱动,如`sqlite-jdbc-3.27.2.1.jar`...

    Java实现时间监听

    在Java中,我们可以使用`java.util.Timer`类、`java.util.TimerTask`类以及Java 8引入的`java.time`包中的接口来实现时间监听功能。下面将详细介绍这些方法。 1. **使用Timer和TimerTask** `java.util.Timer`类...

    用java实现ping的几种方式

    ### 使用Java实现Ping的多种方法 在日常网络管理和软件开发中,经常需要检查网络连通性。`ping`命令作为一种简单而有效的工具被广泛应用于这一领域。本文将介绍几种使用Java来实现`ping`功能的方法。 #### 方法一...

    Java实现微信企业付款到个人零钱简易demo.rar

    总之,Java实现微信企业付款到个人零钱功能涉及到微信支付平台的配置、请求参数的构造、签名算法的应用以及服务器间的通信。通过遵循微信支付的接口规范和安全策略,开发者可以安全有效地完成这一功能的集成。在实际...

    java实现HTML页面转PDF亲测好用

    本教程将详细介绍如何使用Java实现这一功能,重点是通过调用第三方工具`wkhtmltopdf`来完成这个任务。`wkhtmltopdf`是一个开源命令行工具,它利用WebKit渲染引擎将HTML页面转化为高质量的PDF文档。 首先,你需要...

    RSA加密JAVA实现

    RSA 加密 JAVA 实现 RSA 加密是一种非对称加密算法,由 Ron Rivest、Adi Shamir 和 Leonard Adleman 三人于 1978 年一起开发的,所以该算法也被称为 RSA 算法。该算法主要用于数据加密和数字签名,广泛应用于网络...

    DBSCAN的java实现 完整代码

    Java实现DBSCAN的步骤大致如下: 1. **数据预处理**:读取数据集,通常这些数据是以二维坐标形式存储,每个点由(x, y)坐标表示。可以使用`java.util.ArrayList`或`java.util.LinkedList`来存储这些点。 2. **构建...

    计算器java实现报告

    【Java实现简单计算器】 在Java语言中实现一个简单的计算器,主要涉及到基本的算术运算符和控制流程。Java是面向对象的语言,因此我们通常会创建一个Calculator类来封装计算逻辑。下面详细介绍如何实现这个功能: ...

    java调用shell(包含有参数的调用)

    本文将详细解释Java如何调用Shell脚本,包括如何编写Shell脚本和在Java中如何传递参数。 首先,Shell脚本可以被看作是一系列Linux命令的集合,用于自动化执行多个命令。类似于Windows环境中的批处理文件,Shell脚本...

    Java的引用和函数参数传递

    ### Java的引用与函数参数传递详解 #### 一、Java中的引用基础 在Java中,对象的引用扮演着类似于其他编程语言(如C/C++)中指针的角色,但是Java的引用比传统的指针更加安全且易于管理。这是因为Java的设计者们...

    java实现zebra打印条形码

    本篇将详细介绍如何使用Java编程语言来实现与Zebra打印机进行交互,从而打印条形码。 首先,我们需要了解Zebra的通用打印机命令语言(ZPL)或EPL,这是Zebra打印机理解和执行打印任务的语言。ZPL是一种基于文本的...

    java 栈的实现和应用

    本文将深入探讨Java中栈的实现以及其在实际应用中的使用。 首先,我们来理解栈的基本概念。栈是一种特殊类型的线性数据结构,其中元素的添加和删除操作(称为入栈和出栈)只在数据结构的一端进行,这一端被称为栈顶...

    java实现短信功能简单的例子

    ### Java实现短信功能详解 在IT领域,Java作为一种广泛应用的编程语言,在企业级应用、Web开发、移动设备软件开发等方面有着不可替代的地位。其中,利用Java实现短信功能是许多应用场景中的一个常见需求,例如在...

    JAVA反射参数传递概略

    这篇博客文章“JAVA反射参数传递概略”将深入探讨如何使用反射来处理方法参数,尤其是涉及到参数传递的细节。 首先,让我们理解什么是参数传递。在Java中,有两种基本的参数传递方式:值传递和引用传递。值传递是将...

    modbus的读写java实现

    ### Modbus的读写Java实现 #### 一、概述 Modbus是一种广泛应用于电子控制器之间进行数据交换的通信协议标准,常用于工业自动化系统中。它支持多种物理层传输模式,如RS-232、RS-485以及TCP/IP网络等。本文将详细...

    java实现数据导入word代码

    本篇文章将深入探讨如何使用Java实现这一功能,包括导入文字和图片,并且强调了用户需要自行创建模板。 首先,Java中实现数据导入Word通常会用到Apache POI库。Apache POI是一个开源项目,提供了API来读写Microsoft...

Global site tag (gtag.js) - Google Analytics