Java的值传递机制

我们知道在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的拷贝同样可以操作原实例对象,如此而已。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值