一个实例理解java中的值传递和引用传递

例题
public class test {

    public static void main(String[] args) {
        //1
        String str1="abc";
        char[]str2={'a','b','c'};
        exChange1(str1,str2 );
        System.out.println(str1);
        System.out.println(new String(str2));
        
        //2
        StringBuffer sb1=new StringBuffer("A");
        StringBuffer sb2=new StringBuffer("B");
        exChange2(sb1,sb2 );
        System.out.println(sb1.toString());
        System.out.println(sb2.toString());
    }
    private static void exChange2(StringBuffer x,StringBuffer y){
        x=y;
        x.append(y);
    }
    private static void exChange1(String str1,char[]str2){   
        str1="gbc"; 
        str2[0]='g';
    }
    }

运行结果:

abc
gbc
A
BB

定义:

值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参数的值。

引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。
  
a.传递值的数据类型:八种基本数据类型和String(这样理解可以,但是事实上String也是传递的地址,只是string对象和其他对象是不同的,string对象是不能被改变的,内容改变就会产生新对象。那么StringBuffer就可以了,但只是改变其内容。不能改变外部变量所指向的内存地址)。
b.传递地址值的数据类型:除String以外的所有复合数据类型,包括数组、类和接口

分析过程:

eg1:

string是值传递,方法 exchange1,对str1操作与最初定义的str1是无关的。str1的值不变,为abc;
数据是地址传递,更改了最初的str2[ 0 ]的地址所指向的值,str2[ 0 ]的值改变,g

eg2:

StringBuffer 是地址传递(只要不是八大基本数据类型和string,其他都是地址传递)。

(1)首先经过exchange2方法后,x指向sb1指向的内容,也就是A,y指向sb2指向的内容,也就是B

(2)然后,x=y,这时,x和y地址相同,值都为B

(3)最后x.append(y),这个语句执行后,意味着之前值为B的数据变为了BB。但是要注意的是,x和y是局部变量,他们的改变不影响外部的sb1和sb2。

下面是简要的示意图

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值