Mailbomb的J2ME专栏

人生难得几回博,来,让我们博一把

陈跃峰ID:Mailbomb
[修改头像]
611192次访问,排名58好友103人,关注者126
努力学习,努力工作
Mailbomb的文章
原创 241 篇
翻译 12 篇
转载 11 篇
评论 1030 篇
陈跃峰的公告
陈跃峰 个人简历
cqucyf@gmail.com

本BLOG中文章,未经允许严禁用于商业目的!

本人编写的J2ME基础入门书籍: 《新编J2ME就业培训教程》,购买
dearbook
华储网
当当网
Chinapub
最近评论
beey:博主更新的速度也太慢了... ...
Mars2007:谢谢楼主的解答。
heqi915:强烈BS楼上的这位,竟然不尊重别人的劳动成果,不同意博主的观点可以不看

谢谢博主,刚转JAVA,以前学的都忘光了,在这里又给找回来了
heqi915:支持详细的介绍,对初学者是很好的教材
zhoujq:应该要加上一部分:
JavaAPI的获得
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes
文章分类
收藏
    相册
    J2ME技术
    J2ME开发网
    无线空间
    Java网站
    Eclipse官方网站
    Sun中国
    Sun官方网站
    常用网站
    Chinabyte
    Google搜索引擎
    华军软件园
    新浪新闻
    网上书店
    ITbook
    互动出版网
    当当书店
    第二书店
    我工作过的地方
    上海托普信息技术学院
    游戏学院南京校区
    游戏学院郑州校区
    电脑报
    友情链接
    acqy的专栏
    eiyaa的专栏
    上海求职客栈
    刀剑啸的专栏
    刘军的BLOG
    王新钢的BLOG
    贝壳鱼(k7sem)专栏
    骄傲的猫
    存档

    原创 Java语言中的参数传递

    新一篇: J2ME射击游戏实现示例(含源代码和资源)

     
    Java语言中的参数传递
    作者:陈跃峰
     
             在实际的开发过程中,方法调用是一种很常见的操作,在方法调用中,关于参数的处理可能很多进行实际开发的程序员都不一定理解的很清楚,下面系统的介绍一下Java语言中参数传递的规则,以及和参数传递相关的一些问题。
             和其它程序设计语言类似,Java语言的参数传递也分为两种:
    1、 按值传递(by value)
    适用范围:8种基本数据类型、String对象
    特点:在内存中复制一份数据,把复制后的数据传递到方法内部
    作用:在方法内部改变参数的值,外部数据不会跟着发生改变
    2、 按址传递(by address)
    适用范围:数组、除String以外的其他所有类型的对象
    特点:将对象的地址传递到方法内部
    作用:在方法内部修改对象的内容,外部数据也会跟着发生改变
    基础示例代码:
        public class Test1{
        public static void t1(int n){
            n = 10;
        }
        public static void t2(String s){
                   s = "123";
        }
        public static void t3(int[] array){
            array[0] = 2;
        }
        public static void main(String[] args){
               int m = 5;
            t1(m);
            System.out.println(m);
            String s1 = "abc";
            t2(s1);
            System.out.println(s1);
               int[] arr = {1,2,3,4};
            t3(arr);
            System.out.println(arr[0]);
        }   
       }
             按照上面的参数传递规则,该代码的输出结果应该是:5 abc 2。因为int类型是按值传递,所以把参数m传递到方法t1时,相当于又复制了一份m的值,在方法t 1内部修改的是复制后的值,所以m的值不变,s1的输出和m类似。而arr是数组,属于按址传递,也就是把arr的地址传递到了方法t3内部,在方法t3内部修改数组中的值时,原来的内容也发生改变。
             以上特性是Java语言中的规定,在语法上无法指定参数传递是按值传递还是按址传递,但是可以通过下面的变换实现:
    1、 对于按值传递的参数,如果需要在方法调用以后修改参数的值,可以利用返回值来实现。
    2、 对于按值传递的参数,如果需要在方法内部修改时原来的参数不改变,则可以在方法内部重新创建该对象实现。
    示例代码如下:
    public class Test2{
        public static int t1(int n){
            n = 10;
            return n;
        }
        public static String t2(String s){
                      s = "123";
                      return  s;
        }
        public static void t3(int[] array){
            //创建新的数组并赋值
            int[] newArray = new int[array.length];
            //数据拷贝
           System.arraycopy(array,0,newArray,0,array.length);
            newArray[0] = 2;
        }
        public static void main(String[] args){
                      int m = 5;
            //重新赋值
            m = t1(m);
            System.out.println(m);
            String s1 = "abc";
            //重新赋值
            s1 = t2(s1);
            System.out.println(s1);
                      int[] arr = {1,2,3,4};
            t3(arr);
            System.out.println(arr[0]);
        }   
    }
    这样,程序的输出结果就将是:10 123   1
    在实际的程序开发中,可以根据需要使用类似的结构来进行实现。
             下面再介绍一个参数传递的常见应用,利用参数传递实现返回值,这样的功能在IO类设计的read方法中大量使用。示例代码如下:
    public class Test3{
        public static void initArray(int[] array){
                      for(int i = 0;i < array.length;i++){
                                array[i] = i;
            }
        }
        public static void main(String[] args){
                      int[] a = new int[10];
            initArray(a);
            for(int i = 0;i < a.length;i++){
                                System.out.println(a[i]);
            }
        }
    }
             在该示例代码中,在initArray方法内部修改了数组的值以后,外部数组a的值也会发生改变,间接实现了返回值的效果。当然,在该示例代码中,因为只返回一个参数,所以作用体现的不明显,如果需要返回多个参数时,使用按址传递是一种不错的主意。
        因时间仓促,疏漏之处难免,请大家积极补充和指正。
     

    发表于 @ 2007年12月31日 11:49:00|评论(loading...)|编辑

    旧一篇: J2ME游戏代码示例(一)——俄罗斯方块

    评论

    #vincentvan_1225 发表于2008-01-23 10:12:53  IP: 210.5.29.*
    我说两句,按照<Core Java>中的说法,java 语言中是不存在按引用传递的,只有pass by value。

    这样理解:如果我们将一个object 传给某个方法,其实我们是首先将这个object的reference进行值拷贝,然后这个对象现在已经有了2个reference了,这两个reference同时指向了这个地址空间,于是乎,我们通过这两个reference中的任意一个都可以对该地址空间中的数据进行操作,这就是楼主所说的 pass by address了吧?

    一家之言,欢迎批评指正!
    #zhy_cc 发表于2008-01-25 03:07:17  IP: 116.17.116.*
    sadfqwer23432ewrweqr
    #mu_yang 发表于2008-01-26 07:28:07  IP: 221.6.3.*
    "2、 对于按值传递的参数"

    这里,那个"值"字好象写错了.

    "public static String t2(String s){
    s = "123";
    return;
    }"

    感觉那个 return; 写的不对
    #Mailbomb 发表于2008-01-26 21:39:27  IP: 125.46.30.*
    谢谢楼上的,已经修正成return s;
    #sugar712 发表于2008-01-31 09:59:07  IP: 211.158.7.*
    不好意思,问一下一楼的,那这么说,数组拷贝的就是reference了,而8个基本类型拷贝的就是value了哦~还是数组就是直接把地址传进去的呢。

    谢谢回答:)
    #sugar712 发表于2008-01-31 10:01:10  IP: 211.158.7.*
    也谢谢大家指导~~
    #Mailbomb 发表于2008-02-11 17:47:07  IP: 219.150.202.*
    数组传递的是引用,不论对象数组还是基本数据类型的数组
    #newgo333 发表于2008-02-20 19:46:12  IP: 121.41.7.*
    除了基本类型,其它类型都是引用.
    而引用调用实例的所有的操作,只会改变对象实例.引用本身不会有任何变化.
    只有对引用赋值才会改变引用本身的值.


    #kkkdyc 发表于2008-02-21 10:25:24  IP: 210.143.35.*
    楼主有一个地方讲错了,string 是引用传递……
    具体的我去写在我的空间了
    #ejay 发表于2008-02-27 01:34:46  IP: 58.213.209.*
    我通常这样理解:
    Java基本数据类型变量名都可以表示一个具体值,在哪里都是。所以在作为参数传递上只是把值传进去,并不对原来的变量里面东西产生影响。
    Java复合数据类型首先所有变量名只是拿来对具体对象的引用,如同姓名只是一个代号,作为参数传入也就是意味着对它这个对象进行操作了,那么Java复合数据类型中有一个特别的就是String,String因为在Java中规定了不能修改其内容,所有在对其进行操作(修改值)时是改变其对另外的字符串变量或者说实例进行了新的引用。从这一点看来和基本数据类型是差不多的,但我个人觉得似乎并不能直接把其归咎为和基本数据类型一样都是pass by value
    #fengjikun 发表于2008-03-04 16:10:04  IP: 123.120.1.*
    无论是基本数据类型还是复合数据类型都是数据传递(pass by value)!
    因为基本数据类型和复合数据类型本质上都是代表内存里的数据,唯一的区别在于,基本类型的数据是具体值而复合数据类型的数据是一个地址。
    #istimeto 发表于2008-03-07 21:40:16  IP: 192.168.8.*
    呵呵,看来楼主,对于这个理解也不是很深刻哦,String是地址传递的。。。从表面上看你的程序,好像是那么回事。实际上应该是这样的: 字符串“abc”的地址被传给s,然后再把s指向字符串“123”的地址,由于“abc”和“123”的地址是不一样的,所以表面上看起来已经修改了内容,而实际上s1的地址还是字符串“abc”的地址,所以输出的结果没有变化。
    public static void t2(String s){
    s = "123";
    }
    public static void main(String[] args){
    String s1 = "abc";
    t2(s1);}
    #lianyi68 发表于2008-03-12 12:19:47  IP: 59.61.58.*
    总结了下!还是不错的!
    希望多做些这方面的文章!
    支持
    #niuniumam 发表于2008-03-14 11:27:08  IP: 124.227.102.*
    感觉和c相似呀!
    #yanglufang 发表于2008-03-14 22:32:54  IP: 61.152.161.*
    我个人认为,楼主说的是有道理的,by value or by reference 是不同的概念。看来这帖子以后明白了不少,以后会继续关注楼主的帖子,并且自己也会积极地参与到讨论中!我也希望为JAVA在中国的发展起到自己应有的作用!
    #xmc010 发表于2008-03-19 16:44:26  IP: 58.211.186.*
    实在是不同意楼主的看法!这只是表面现象而非实质,我还是同意vincentvan_1225的观点!
    #fcpahj 发表于2008-03-23 15:59:49  IP: 218.87.32.*
    同意一楼的观点。
    #oktrinket 发表于2008-04-02 09:41:55  IP: 61.144.230.*
    楼主不要误导新人了,就在CSDN上就有无数的大神阐述过JAVA参数传递只有一种:BY VALUE,一楼的观点才是正确的
    #edward_fu 发表于2008-04-03 13:35:37  IP: 220.178.24.*
    core java 第一卷 p114-p117.。lz应该好好看看。
    #lxp11 发表于2008-04-03 19:19:11  IP: 58.60.187.*
    写得还没有,不错有进步.这样写很好,别人看了都很容易就明白!!!!谢谢!!
    #lxp11 发表于2008-04-03 19:19:47  IP: 58.60.187.*
    还 可以
    #lxp11 发表于2008-04-03 19:20:04  IP: 58.60.187.*
    还 可以
    #lhbmqq 发表于2008-04-04 01:31:12  IP: 221.221.23.*
    受教
    #Afxtruelover 发表于2008-04-06 12:12:22  IP: 221.213.18.*
    同意一楼的说法

    #kurtis 发表于2008-04-11 13:34:44  IP: 218.107.133.*
    LZ 理解有误,java中的参数传递都是pass by value 的,准确的说参数传递的是一个reference的副本,所谓pass by value指的正是这一点!

    拿String来说:
    public static String t2(String s){
    s += "123";
    return s;
    }
    参数s实际是一个指向String对象的reference的副本,由于String对象是不可变的,对其操作都会产生新的对象,也就是说这个reference的副本和原reference已经不指向同一对象了,因此原reference的内容不变;
    同理,例如参数是List类型,那么对其进行add操作,由于reference的副本和原reference仍旧指向同一对象,因此原对象内容会改变;
    #aibushihuangrong 发表于2008-04-22 23:42:16  IP: 125.46.111.*
    受教
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © 陈跃峰