值傳遞:(形式參數類型是基本數據類型):方法調用時,實際參數把它的值傳遞給對應的形式參數,形式參數只是用實際參數的值初始化本身的存儲單元內容,是兩個不一樣的存儲單元,因此方法執行中形式參數值的改變不影響實際參數的值。數組
引用傳遞:(形式參數類型是引用數據類型參數):也稱爲傳地址。方法調用時,實際參數是對象(或數組),這時實際參數與形式參數指向同一個地址,在方法執行中,對形式參數的操做實際上就是對實際參數的操做,這個結果在方法結束後被保留了下來,因此方法執行中形式參數的改變將會影響實際參數。函數
//按值傳遞this
public class shiyan { //先建立一個更改變量的函數,並加上了打印的函數用於比較 public void change(int c){ c=c*5; System.out.println(c); } public static void main(String[] args) { // TODO Auto-generated method stub int p=5; //先聲明一個變量p=5 shiyan c=new shiyan(); //建立對象c //利用c的成員函數改變p值,使p=p*5 c.change(p); //輸出的是理想值25 System.out.print(p); //奇怪輸出的是5 } }
輸出結果:25 5spa
分析:這就是按值傳遞的效果,由於此時傳入的不是p自己,只是p的值,傳遞的是p自己的是副本。
因此打印出的是(p副本的值)的改變結果25,然後一個打印出的是p的真身沒有改變過所以是5設計
//按引用傳遞3d
package yinyong; //先定義一個學生類 public class Student { //設計重載構造函數,爲了後面的演示方便 public Student(){ } //用於取名的構造函數 public Student(String p){ name=p; } //用於更名的的函數,不過得改爲別人的名字 public void changName(Student p){ this.name=p.name; } public String name; }
package yinyong; public class teacher { public static void main(String[] args) { // TODO Auto-generated method stub //建立a這我的給a學生取名李明 Student a=new Student("李明"); //建立b這我的給b學生取名趙明 Student b=new Student("趙明"); //建立c這我的,還未起名 Student c=new Student(); //分別輸出a,b兩我的的名字 System.out.println("a同窗名字是"+a.name); System.out.println("b同窗名字是"+b.name); //將c人的名字指向b,實質是將b的地址賦給c,這樣c,b同指一片內存區域 c=b; System.out.println("c同窗名字是"+c.name); //果真c的名字變爲了趙明 b.changName(a); //利用更名函數改變b的名字,將a對象傳入將a的名字賦給b System.out.println("b同窗名字是"+b.name); //結果是a的名字李明 } }
輸出:a同窗名字是李明
b同窗名字是趙明
c同窗名字是趙明
b同窗名字是李明code
分析: 因爲是按引用調用因此,傳遞的時候時刻都是把對象的真身傳遞過去,而且能夠改變真身的屬性和方法。傳遞時時候也把真身的地址傳了過去,這樣引用時就指向了同一片地址內存空間。對象