【java】的传值方式

【java】的传值方式

 

当你问大多数程序员Java是传值还是传引用的时候,你可能会得到两种答案之一:

(1)Java传递原始类型数据时使用的是传值方式;传递对象时则使用传引用方式;String类型的数据采用的是传值方式,因为字符串是不可变的。(2)Java传递所有参数都使用传值方式

 

只有第二个答案是正确的。理解传值和传引用的区别的关键是要记住,当你向一个方法传递一个对象时,Java没有把对象放入堆栈,它只是拷贝对象的引用然后将这个引用的拷贝放入堆栈。也就是说,根据定义,Java使用的是传值方式。

 

证明
如果Java通过传引用方式传递对象,那么执行下面的代码就会交换保存在两个变量a和b中的引用,而相应的输出应该如下:

 

a: 4
b: 100
Swapped!
a: 100
b: 4

 

其实真正的动作是在方法的参数o1和o2中的引用,它并不影响原始变量a和b。下面是其实际输出:

 

a: 4
b: 100
Swapped!
a: 4
b: 100

 

public class SwapTip {
    public static void main(String []args) {
        Integer a = new Integer(4);
        Integer b = new Integer(100);

        System.out.println("a: " + a);
        System.out.println("b: " + b);

        swap(a, b);

        System.out.println("Swapped!");
        System.out.println("a: " + a);
        System.out.println("b: " + b);
    }

    public static void swap(Object o1, Object o2) {
        Object t = o1;
        o1 = o2;
        o2 = t;
    }
}

 

为什么说这个争论的答案是有意义的?
很多参与过争论传递参数的方式的程序员最后都会说:“只是语义不同而已”或者是“没有关系,因为都理解它真正的工作原理。”

 

对于有经验的程序员来说这可能是一个语义问题,但是对于那么没有什么经验的程序员来说,情况就不一样了。对于程序员来说一个语言的黑拿越少,他们在用那种语言写程序的时候就能做得越好。

 

一个类比

 

对象引用与实例的关系就像遥控器与电视机的关系,引用控制对象就像遥控器控制电视机一样。如果一个遥控器的复制品给了另一个人,那么那个人也可以控制电视机。复制的遥控器对电视机的动作(比如说调节音量、改换频道或者调节时钟)对于它本身和原装遥控器来说都是可见的。如果那个人改装了复制的遥控器去控制另外一台电视机,那么原来的遥控器不会受到影响。

 

诚然,Java是通过传值还是传引用的方式来传递参数只是一个学术上的区别,只要我们知道期望哪种行为即可。但是有时候知道台后的事情也是重要的。

Java只有一种参数传递方式,那就是传值。它简单、有文档可查并且确实是如此。

转自http://www.blogjava.net/zsh118/articles/24564.html

 

 

 

public class Test {
    public static void main(String[] args) {
        StringBuffer a = new StringBuffer("A");
        StringBuffer b = new StringBuffer("B");
        int i = 5;
     System.out.println(a + "," + b + "," + i); operate(a, b, i); System.out.println(a
+ "," + b + "," + i); } public static void operate(StringBuffer x, StringBuffer y, int j) { x.append(y); y = x; y.append("C"); j = 1; } }

 

运行结果:

A,B,5
ABC,B,5

规律总结:
Java参数,不管是原始类型还是引用类型,传递的都是副本
    如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的。如果在函数中改变了副本的值不会改变原始的值.
    如果参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址如果在函数中没有改变这个副本的地址,而是通过地址改变改变了地址指向的值,那么在函数内的改变会影响到传入的参数。
 
    如果在函数中改变了副本的地址,如当执行如a=其他对象,a=new等赋值操作时,实际上是将a指向新的位置,那么函数外的原值不改变。
 
转自:http://www.cnblogs.com/wangfeixiong/p/7158442.html

 

posted @ 2017-09-05 13:53  Angelye  阅读(579)  评论(0编辑  收藏  举报