20200423 值傳遞和引用傳遞

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章