dedecms织梦内容管理系统    
首页 | java | C/C++ | PHP | 操作系统 | ajax | 脚本编程 | 安全技术 | 本站下载页 | flex | CRM | 专题 | QQ群 | 测试中心 | 会员中心 | 积分规则
  当前位置:主页>java>java基础>文章内容
Java语言的参数传递和处理方法 - 全面掌握Java参数传递与参数
来源: 作者:

不只是对于Java初学者,就是对于有多年Java开发经验的老手来说,Java里的参数传递也是一个非常容易混淆弄错和被忽略的的概念。


而这种忽略,往往会造成一些非常隐蔽而难以被发现的错误。

尤其当一个程序日趋复杂庞大时,如果在参数传递方面不知道Java对参数的处理规则,将会给系统留下种种隐患。
本文将对Java语言对参数的传递和处理方法作一个全面深入地介绍。

一般的计算机语言,一个方法调用另一个方法(或者说父程序调用另一个子程序),参数传递一般可以分为:
按值调用(call-by-value):
这种调用,即使在子程序中改变了参数值,但在父程序中该参数对应的原变量值并未改变。
引用调用(call-by-reference):
这种调用,如果在子程序中改变了参数值,父程序中该参数对应的原变量值也将得到改变。

那么,Java语言在调用一个方法传递参数时,Java里的参数传递是怎么进行的,Java语言对参数是怎么处理的呢?

简单地说,Java语言对参数的处理也有2种方法,按值调用以及引用调用。如下:
1,按值调用方法:如果所传递的参数是String, Integer, int, Long, long, Boolean, boolean等简单类型,即使在一个方法内部改变了该参数的值,但并不影响方法外部参数本身的值。
2,引用调用方法:相反,如果所传递的参数是Java复合类型,则若在一个方法内部改变了该参数的值,则在该方法外部,该对象的值也跟着得到改变。

下面,用一个简单地例子说明:
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public class TestJavaParam {

    /**
     * @param args
     */

    public static void main(String[] args) {
        TestJavaParam testJavaParam = new TestJavaParam();
        
        
        //测试 传递一个 Integer 参数: 简单类型的参数
        Integer param1 = new Integer(0);
        System.out.println("param1=" + param1.toString());
        testJavaParam.testSimpleValueParam(param1);
        System.out.println("param1=" + param1.toString());
        
        //测试 传递一个 int 参数: 简单类型的参数
        int param2 = 0;
        System.out.println("param2=" + param2);
        testJavaParam.testSimpleValueParam(param2);
        System.out.println("param2=" + param2);
        
        
        //测试 传递一个 String 参数: 简单类型的参数
        String param3 = "Hello ";
        System.out.println("param3=" + param3);
        testJavaParam.testSimpleValueParam(param3);
        System.out.println("param3=" + param3);
        
        //测试 传递一个 ComplextObject 参数: 复合类型的参数
        ComplextObject param4 = new ComplextObject("OldId", 0);
        System.out.println("param4=[ComplextObject.id]=" + param4.getId() + " [ComplextObject.index]=" + param4.getIndex());
        testJavaParam.testComplextObjectParam(param4);
        System.out.println("param4=[ComplextObject.id]=" + param4.getId() + " [ComplextObject.index]=" + param4.getIndex());
        
        //测试 传递一个 List 参数: 复合类型的参数        
        List param5 = new ArrayList();
        System.out.println("param5=[List.size]=" + param5.size());
        testJavaParam.testCollectionParam(param5);
        System.out.println("param5=[List.size]=" + param5.size());
    }
    
    
    public void testSimpleValueParam(Integer i) {
        i = i+1;
    }
    public void testSimpleValueParam(int i) {
        i = i+1;
    }
    public void testSimpleValueParam(String i) {
        i = i+ " test.";
    }
    
    
    public void testComplextObjectParam(ComplextObject obj) {
        obj.setId("ChangedId");
        obj.setIndex(1);
    }
    
    public void testCollectionParam(Collection collection) {
        collection.add("AddedString");
    }

}

class ComplextObject {
    private String id;
    private int index;
    
    public ComplextObject(String id, int index) {
        this.id = id;
        this.index = index;
    }
    
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public int getIndex() {
        return index;
    }
    public void setIndex(int index) {
        this.index = index;
    }
    
    
}

  
编译执行后,显示:
c:\>Java\javac TestJavaParam.java

c:\>Java\java TestJavaParam
param1=0
param1=0
param2=0
param2=0
param3=Hello
param3=Hello
param4=[ComplextObject.id]=OldId [ComplextObject.index]=0
param4=[ComplextObject.id]=ChangedId [ComplextObject.index]=1
param5=[List.size]=0
param5=[List.size]=1

我们发现,简单类型的参数param1,param2,param3的值在子方法的调用前后并未发生改变,而复合类型的参数param4,param5的值却发生了改变。

上一篇:Java语言的克隆与深层次克隆技术入门与精通   下一篇:Java/J2EE中文问题终极解决之道
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论
  热点文章
·JUnit单元测试(2)
·JUnit单元测试(1)
·浅谈在Java语言中究竟是传值还是
·Java 5.0 多线程编程实践
·Java的文件 读和写
·对于JAVA基础测试中常见的异常问
·JAVA程序员面试33问,你能回答多
·Java Reflection (JAVA反射)详解
·JAVA中配置环境变量设置方法大全
·讲述java语言中内部类的研究
·详细解析Java中抽象类和接口的区
·Java开发中的事件驱动模型实例详
  相关文章
·Java语言的克隆与深层次克隆技术
·Java/J2EE中文问题终极解决之道
·java学习----理解面向对象的程序
·怎么向一个命令行Java程序传递参
·Vector & ArrayList 哪一个更好
·讨论 Java 技术新手入门
·深入 JAVA对象的复制与比较
·Java输入输出(Java IO)处理概
·java多线程编程
·Java开发者需坚守的十大基本准则
·JAVA如何调用DOS命令
·如何使用Static的变量和方法
  相关信息
copy right @ 百家拳软件项目研究室 2007 辽ICP备07011763