1. 程式人生 > 其它 >5.基本型別引用型別傳遞

5.基本型別引用型別傳遞

具體程式碼如下:
    @AllArgsConstructor
    @NoArgsConstructor
    @ToString
    @Data
    class Person {
        private int age;
        private String name;
    }
    
    public class TestTransferValue {
        public void changeInt(int age) {
            age = 30;
        }
        public void changePerson(Person person) {
            person.setAge(30);
        }
        public void changeString(String str){
            str="你好";
        }
        public static void main(String[] args) {
            //重點1:更改基本型別的值--->輸出的竟然是18而不是30
            TestTransferValue testTransferValue = new TestTransferValue();
            int age=18;
            testTransferValue.changeInt(age);
            System.out.println("int---->"+age);
            //重點2:修改引用型別的值--->輸出修改以後的值
            Person person = new Person(18,"吳孟達");
            testTransferValue.changePerson(person);
            System.out.println("person---->"+person);
            //重點3:修改String---->輸出的仍是吳孟達
            String str="吳孟達";
            testTransferValue.changeString(str);
            System.out.println("String--->"+str);
        }
    }
輸出:
    int---->18
    person---->Person(age=30, name=吳孟達)
    String--->吳孟達
int型別的傳值(注意並沒有返回值,只是修
int型別的傳值(注意並沒有返回值,只是修改其傳入的值)
public void changeInt(int age) {
    age = 30;
}
重點理解:基本型別的值是儲存在各自的執行緒棧中(執行緒的工作記憶體)

引用型別的值

public void changePerson(Person person) {
    person.setAge(30);
}
重點理解:區域性變數的引用型別:物件名稱存放線上程棧中(儲存堆中物件的記憶體地址),具體物件存放在堆中

傳遞String

public void changeString(String str){
    str="你好";
}
重點:字串常量池的存在(jdk版本號<=1.6字串常量池在方法區,>=1.7在堆區)
出現str="你好";會直接在常量池建立一個新的字串"你好",並返回字串地址,即這兩個引用已經沒有任何關係
所以main方法輸出的是自己的引用!