请选择 进入手机版 | 继续访问电脑版
楼主
[JAVA大数据]| 发表于 2017-8-26 11:47:11 |阅读模式 245 0

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
经过好久查询,终于把java的值传递问题搞清楚了,
结论:在java中只有值传递!
在方法的参数传递中,java对象传递的仅仅是该对象的拷贝。
即传递的是对象的地址值,这还是值传递。
在方法体中,对该对象所做的一切调换对象行为及其修改属性行为,都是无意义的,因为当方法体结束后,JVM会回收此方法体内存。
在方法中所做的引用指向另一个对象,会被JVM销毁,最后原本对象的引用还是指向最开始地址。


说明:java值传递时,传递的是对象的拷贝,但他们指向同一个存储空间,改变其属性是有效的
         * 又因为传递的是拷贝,所以在方法体中调换对象指向是没有意义的,因为一旦方法结束,该内存会释放
         * 在方法中所做的引用指向另一个对象,之后的修改行为在方法结束后会被JVM销毁。
这不同与C++,在C++中传递的是对象的别名,所以在方法体中修改,调换就是修改原对象的存储空间内容。而这是有效的!
如下示例:
/**
* java只存在值传递,对象中传入的仅仅是对象的拷贝,
* 即传递的是引用的地址值,所以还是值传递
* @author Administrator
*/
public class Test11 {

        private String name;
        public static void change(int a){
                a=50;
        }
        /**说明,java值传递时,传递的是对象的拷贝,但他们指向同一的存储空间,改变其属性是有效的
         * 又因为传递的是拷贝,所以在方法体中调换是没有意义的,因为一旦方法结束,内存会释放
         * 在方法中所做的引用指向另一个对象,会被JVM销毁,最后原本对象的引用还是指向最开始地址
         */
        public static void swap(Test11 t){
                Test11 t2 = new Test11();
                t2.name="fff";
                t=t2;
                t.name="bcd";
        }
        /**
         * 在方法体中 另new一个数组对象,让b指向新对象,做出的修改只是它新指向
         * 对象的修改,方法体外无效。
         * @param b
         */
        public static void arrayChange(char[] b){
                char[] k={'m','n','l','j'};
                b=k;
                b[0]='o';
                System.out.println(Arrays.toString(b)+"*****8");
        }
        public static void main(String[] args) {
//                int a=10;
//                System.out.println(a);
//                change(a);
//                System.out.println(a);
                Test11 t = new Test11();
                t.name="abc";
                System.out.println("改变前:"+t.name);
                swap(t);
                System.out.println("改变后:"+t.name);
                /**
                 * 同理,那么一个数组对象,被在方法体中修改后也有效
                 */
                char[] c={'a','b','c','d'};
                arrayChange(c);
                System.out.println(Arrays.toString(c));
        }
}
以下控制台输出:
改变前:abc
改变后:abc
[o, n, l, j]*****8
[a, b, c, d]
分享到:  微信微信
回复回复0 收藏收藏0 分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /3 下一条

育知同创学员技术交流社区

问币兑换|社区帮助|免责声明|交换友情链接|育知同创学员技术交流社区

Powered by Discuz! X3.2 Licensed© 2001-2013 Comsenz Inc. 京ICP备16004053号

GMT+8, 2018-2-22 02:47 , Processed in 0.128505 second(s), 26 queries .

快速回复 返回顶部 返回列表