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的值.
     * 八大基本數據類型都是這個吊樣.
     * */
}

Stringspa

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 同樣   在 方法中進行傳遞的時候  不會改變自身的值, 可是 類 能夠改變自身的值..         
         * * */
    }
}

code

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也是類可是   不會改變呢? 總結一下:blog

在兩個方法當中內存

name = "小貝";
duck.age = 5;
/** * 八大基本上數據類型屬於值傳遞. * String以及其他的引用數據類型屬於引用傳遞. * 八大基本數據類型和String 不會改變其內容 , 其他的會改變內容. * 八大基本數據類型:  新申請了棧內存空間, 在函數內的 全部操做都是針對形參的, 不管怎樣搞, 都不會改變實參的值. * String: 新申請了佔內存空間, 可是改變String的值的時候, 會將新的堆內存的空間地址放到棧內存當中, 這樣的話本來的棧內存和堆內存都沒有發生變化, 因此String也不會變. * 對於普通的引用數據類型, 在調用函數的時候: 新申請的形參存儲的是本來引用數據類型的堆內存的地址, 在修改數據的時候會改變原來堆內存的內容. 和String的棧內存堆內存都不變相比, 這裏改變了堆內存的內容, 因此值發生變化. * * 能夠作一個實驗, 在普通引用數據類型作形參的時候, 不改變堆內存的內容, 先改變一下 棧內存的地址, 這樣也不會發生變化. */
相關文章
相關標籤/搜索