JAVA值传递和引用传递 以及 实参是否改变

八大数据类型和String 在进行传递的时候  不会改变.

八大数据类型

public class parameterValue {    //值传递
    public static void main(String[] args) {
        int x = 10;
        method(x);
        System.out.println(x);
    }
    public static void method(int mx) {
        mx = 20;
    }
    /**
     * 在栈内存中申请mx  这时候  x 和mx 存储的值 是一样的,但是x和mx的地址是不一样的,mx=20;并不影响x的值.
     * 八大基本数据类型都是这个吊样.
     * */
}

String

package oneDay;

public class RefDemo1 {
    public static void main(String[] args) {
        String nameString = "小飞";
        
        String yuanString;
        yuanString = new String("asd");
        System.out.println(yuanString);
        
        method(nameString);
        System.out.println(nameString);
    }
    private static void method(String name) {
        name = "小贝"; // 相当于 name = new String(); name = "小贝";
        // 相当于 指向改变
        /**
         * 简单解释一下. String nameString 相当于在栈空间中申请了一块空间,用于存储引用地址(此时没有引用地址为空).
         * nameString = 小飞; 相当于 nameString = new String("小飞"); 这时候 在堆内存申请了一块空间用于存储 实际的值.
         * 也就是说 在method 这个方法 当中. 形参 String name 相当于 String name; name = nameString; 这时候  name和nameString在栈内存中
         * 存储的引用地址  是一样的 ,  当时当
         * name = "小贝";的时候  该代码 相当于 name = new String("小贝"); 在堆内存中新申请了一块空间, 将该地址 赋予name  这时候 name和nameString在栈内存中
         * 存储的值(引用地址) 就又不一样了. 所以 八大基本数据类型和String 一样   在 方法中进行传递的时候  不会改变自身的值, 但是 类 可以改变自身的值..         
         * * */
    }
}

package oneDay;


public class RefDemo {        //引用传递
    public static void main(String[] args) {
        Duck duckYuan = new Duck();        
        System.out.println("Duck age = "+duckYuan.age);
        method(duckYuan);        
        System.out.println("Duck age = "+duckYuan.age);
    }
    private static void method(Duck duck) { 
        duck.age = 5; 
    }
    /**
     * Duck duckYuan = new Duck(); 在栈内存和堆内存中申请空间,并将 堆内存的地址 放入栈内存中,以待使用. 
     * 形参中的 Duck duck 在栈内存中申请空间,并将上面的duckYuan内存储的堆内存的地址放入duck中,
     * 然后  方法内的duck.age = 5; 这时候的duck和duckYuan栈内存地址虽然不同,但期内存储的堆内存的地址 都是指向同一块堆内存地址的,这样就改变了原来的值.
     * 
     * */
}

class Duck{
    int age = 2; //省略封装
}

为什么   String也是类但是   不会改变呢? 总结一下:

在两个方法当中

name = "小贝";
duck.age = 5;

第一行的 name = "小贝";  相当于 name = new String("小贝"); 在堆内存中 重新申请了一块空间. 然后将地址赋予 name.

第二行的 duck.age 是 在堆内存中 已经有了空间,然后只是将 该堆空间age 赋值为5.

 第一行和第二行相同的是  栈内存的空间都是相同的, 不同的是 String 重新申请了一块堆空间  改变的不是原始的 所以值不变, 第二行 没有重新申请空间, 使用的是 原始的堆空间所以 值 改变了.

转载于:https://www.cnblogs.com/A-FM/p/5627927.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值