Java的值传递机制

来源:互联网 发布:js ready onload 编辑:程序博客网 时间:2024/05/17 06:45

我们知道在C/C++中有值传递和地址传递这两种概念,值传递会将实参复制一份,对它的改变并不会对原数据造成影响,而地址传递传递的是数据的地址,通过地址可以对原数据进行操作。

Java中好像没有地址这种概念,那它的传递到底是什么传递呢?这个似乎很难说清楚,比如下面的程序:

public class Test {
    
private int i;

    Test() {
        i 
= 0;
    }

    
public static void main(String[] args) {
        Test t
=new Test();
        System.out.println(t.i);    
//0
        changeObject(t);
        System.out.println(t.i);    
//1
        
        
int x=0;
        System.out.println(x);        
//0
        changeVariable(x);
        System.out.println(x);        
//0
    }

    
public static void changeObject(Test t) {
        t.i
++;
    }

    
public static void changeVariable(int x) {
        x
++;
    }
}

输出结果将是后面注释中所显示的,当一个Test的对象t作为参数的时候,我们改变了它,而当一个int的x作为参数的时候却没能改变。这似乎告诉我们Java中对与对象作为参数的情况实施的是地址传递,对简单类型的参数实施的是值传递。差不多是可以这样理解,但是Java中没有地址传递的概念,实际上都是值传递,那么为什么传递的t能够被修改呢?

要注意的是,Java中虽然没有地址的概念,但是有引用的概念,当我们Test t=new Test();的时候,实际上产生了两个对象,一个是Test类的实例,另一个就是对这个实例的引用,它就是t。作为我们参数的t实际上是一个对象的引用,而不是对象本身。为什么说Java里面是值传递?因为我们用t作为参数的时候,实际上会生成一个t的拷贝,这和简单类型的值传递没有什么区别。t的拷贝和t一样,同样会指向原来的那个Test实例,通过t的拷贝同样可以操作原实例对象,如此而已。

 

原创粉丝点击