20200423 值传递和引用传递

变量的引用和变量的值

变量的内容,有可能是一个值,也有可能是指向一个对象的引用。

当变量的类型为基本型别(short, byte, int, long, float, double, boolean, char)时,变量的内容是一个值;当变量的类型为 Object 及其子类时,变量的内容是指向一个对象的引用。

画内存结构图辅助理解值类型和引用类型。

 

 

 

基本数据类型作比较,值相等则相等,值不相等则不相等(忽略数据类型)

引用类型作比较,引用地址相等则相等,否则都是不等的。

 

 

int属于基本数据类型,因此在方法中进行传递和引用时,并不会改变该变量的数值

而arr属于数组,是引用数据类型,因此在方法引用时,实际传递的是该数组在堆内存中的物理内存地址,在方法中对该数组进行操作,则会影响到该数组内部的数值,会发生改变.

 

在java中,基本数据类型作为参数传递的时候叫做值传递,传的是值本身,

值传递:值在该方法中改变属于局部变量改变

当出了该方法就没有作用了(方法中的传递的基本数据类型就属于局部变量)

 

在 Java 中,凡是可以指向一个对象或包含一个值的标识符,都可以称为变量。

变量的内容,有可能是一个值,也有可能是指向一个对象的引用。

 

String /基本数据类型包装类,虽然都是引用数据类型,但是在发生传参的时候,它们传的是值

public class TestReference {

    public static void main(String[] args) {
        
        //Integer i = new Integer(5);
        //System.out.println(i.hashCode());

        //int j = 5;
        //System.out.println(j.hashCode());
        //不能对基本类型调用方法,但可以对引用类型调用方法:

        /*
        Integer a = 120;
        int b= 120;
        Integer c = 120;
        Integer d = new Integer(120);
        System.out.println(a == b);   //产生的原因是编译器编译时会调用intValue()自动的将a进行了拆箱,结果肯定是true;
        System.out.println(a == c);   //true  jdk对-128~127之间的值做了缓存。
        System.out.println(a == d);   //false  new Integer(120)构造器会创建新的对象。

        Integer e = 128;
        Integer f = 128;
        System.out.println(e == f);  //false  大于128 使用==比较,不相等。
        */

        /*
        int n=3;
        int m=3;
        System.out.println(n==m); //直接比较值

        String str = new String("hello");
        String str1 = new String("hello");
        String str2 = new String("hello");

        System.out.println(str1==str2); //两个对象

        str1 = str;
        str2 = str;
        System.out.println(str1==str2); //指向了同一个引用
        */
        
        /*
        boolean b = false; //值传递
        Boolean boo = new Boolean(false);//包装类因为会自动装箱拆箱,所以可以和基本类型一样处理,所以示例中boo的值就是false;
        Boolean[] arr = new Boolean[]{false}; // 数组是引用类型,所以arr的值就是指向该Boolean[]的引用。
        //java中只有值传递没有引用传递,所以传入getMiddleOne方法的三个参数分别是b的值拷贝, boo的值拷贝, arr的值拷贝。
        //java中只有值传递,基本类型传递的是值的副本,引用类型传递的是引用的副本。
        getMiddleOne(b, boo, arr);

        System.out.println(b);
        System.out.println(boo.toString());
        System.out.println(arr[0]);  //arr的值就是指向该Boolean[]的引用。
        */

    }

    private static void getMiddleOne(boolean b, Boolean boo, Boolean[] arr) {
        b = true;
        boo = new Boolean(true);
        arr[0] = true;
    }
    
}

 

https://blog.csdn.net/weixin_42386014/article/details/81121620

https://blog.csdn.net/YidingHe/article/details/4205617

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值