java按值传递

C语言中可以使用指针*或引用&把一企业基本数据类型传到一个函数里面,然后改变它的值,Java没有这个功能。

Java中所有的赋值操作=和函数传参,传递的都是“值”,但是要特别强调一下,对于引用数据类型(除基本数据类型以外的所有java数据类型,String也属于引用数据类型)的变量,变量本身的值是指向那片内存的地址。

StringBuffer  a=new StringBuffer("123");

StringBuffer b=a; //b也指向了a所指的内存

b.append("456"); //通过b修改了内存的内容

System.out.println(a); //通过a访问内存中的内容

输出:123456


StringBuffer  a=new StringBuffer("123");

StringBuffer b=new StringBuffer(a); //开辟了新的内存空间,然后发生了复制

 b.append("456"); //不影响a所指的内存空间

System.out.println(a);

输出:123


String a="123"; //开辟了内存空间,里面存放“123”,a指向了这片内存

String b=a; //b也指向了a所指的内存空间

b="456"; //开辟了新的内存空间,里面存放“456”,b指向了这片新的内存

System.out.println(a);


        String[] arr=new String[3];
        
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]+"\t");
        }
        System.out.println();
        
        for(int i=0;i<arr.length;i++){
            arr[i]+="w";
        }
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]+"\t");
        }
        System.out.println();
        
        for(String ele: arr){
            ele+="D";
        }
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]+"\t");
        }
        System.out.println();

输出:

null null null
nullw nullw nullw
nullw nullw nullw

String数组创建之后,默认将每个元素初始化为null。注意null并不是什么都没有,null本身也是一个数值,也要占存储空间。

通过for(int i=0;i<arr.length;i++)这种方式遍历数组或集合时,取得的是每个元素“本来的内容”,所以这种方式可以修改数组的内容。

通过for(T ele:collection)这种方式遍历数组或集合时,取得的是每个元素的“副本”,所以这种方式不能改变数组原来的内容。


把引用类型当参数传递时传递的是地址。

public static void main(String[] args) {
        StringBuffer s1 = new StringBuffer("good");      //内存块1里存放的内容是"good",现在s1指向该内存块
        StringBuffer s2 = new StringBuffer("bad");      //内存块2里存放的内容是"bad",现在s2指向该内存块
        test(s1, s2);
        System.out.println(s1);     //输出内存块1的内容
        System.out.println(s2);     //输出内存块2的内容
    }

    static void test(StringBuffer s3, StringBuffer s4) {        //传参时按值发生了复制,即s3指向内存块1,s4指向内存块2
        s4 = s3;     //s4指向了内存块1
        s3 = new StringBuffer("new");        //开辟了新的内存块3,内存块3里存放的内容是"new",现在s3指向该内存块
        System.out.println(s3);         //输出内存块3的内容
        System.out.println(s4);         //输出内存块1的内容
        s3.append("hah");        //内存块3的内容变成了"newdhah"
        s4.append("hah");       //内存块1的内容变成了"gooddhah"
    }
输出:

new
good
goodhah
bad


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值