傳參問題

wxc_Huang發表於2020-11-01

java 傳遞引數的兩種方式

java中的經典問題:傳值與傳引用

java形參、實參、值傳遞、引用傳遞

  • 函式的形式引數,是 傳入引數的拷貝(把棧裡面的值複製一份傳給引數)
    • 引用變數之間拷貝的是 【地址】
    • 基本變數之間拷貝的是 【記憶體中的值】(被稱為直接量)

實參

用來接收呼叫方法時傳遞的引數,只有在被呼叫時才分配記憶體,一旦呼叫結束,就釋放記憶體空間,因此僅在方法內有效

public void swap(int a, int b) {

    int temp = a;
    a = b;
    b = temp;
}

// 這裡a,b就是形參,方法結束時,在棧空間就會被銷燬。

實參

呼叫上面方法swap(6, 8); 其中6 8就是實參

形參

值傳遞

  • 方法呼叫時,實際引數把它的值傳遞給對應的形式引數,函式就收到的是原始值的副本
  • 方法執行中形式引數值的 改變 不影響實際引數的值
  • 資料型別
    • 八種基本資料型別,包裝類(類似於基本資料型別)
    • String
      • 事實上 String 也是傳遞的地址,只是 String 物件和其他物件是不同的
      • String物件是不能被改變的,內容改變就會產生新物件
      • 那麼StringBuffer就可以了,但只是改變其內容。不能改變外部變數所指向的記憶體地址)

引用傳遞

  • 也稱為傳地址

  • 方法呼叫時,實際引數的引用(地址,而不是引數的值)被傳遞給方法中相對應的形式引數

  • 在方法執行中,對形式引數的操作實際上就是對實際引數的操作,方法執行中形式引數值的改變將 會影響 實際引數的值

  • 資料型別

    • 除 String 以外的所有複合資料型別,包括陣列、類和介面
    	public class People {
    	
    	    private String name;
    	    private String age;
    	
    	    public People(String name, String age) {
    	        this.name = name;
    	        this.age = age;
    	    }
    	
    	    public String getName() {
    	        return name;
    	    }
    	
    	    public void setName(String name) {
    	        this.name = name;
    	    }
    	
    	    public String getAge() {
    	        return age;
    	    }
    	
    	    public void setAge(String age) {
    	        this.age = age;
    	    }
    	}
    	
    	
    	public class Base1 {
    	    
    	    public static void main(String[] args) {
    	
    	        int a = 10;
    	        // 按值傳遞
    	        test1(a);
    	        System.out.println("main a==" + a);
    	        
    	        
    	        People p = new People("rose", "18");
    	        // 按引用傳遞
    	        test2(p);
    	        System.out.println("main name==" + p.getName() +", age==" + p.getAge());
    	    
    	    }
    	
    	    public static void test1(int a) {
    	        a = 20;
    	        System.out.println("test1 a==" + a);
    	    }
    	
    	    public static void test2(People p) {
    	        p.setName("jack");
    	        p.setAge("19");
    	        System.out.println("test2 name==" + p.getName() +", age==" + p.getAge());
    	    }
    	}
    
    	test1 a==20
    	main a==10
    	test2 name==jack, age==19
    	main name==jack, age==19
    

相關文章