總結:
1.將對象(對象的引用)作爲參數傳遞時傳遞的是引用(相當於指針)。也就是說函數內對參數所做的修改會影響原來的對象。
2.當將基本類型或基本類型的包裝集作爲參數傳遞時,傳遞的是值。也就是說函數內對參數所做的修改不會影響原來的變量。
3.數組(數組引用))作爲參數傳遞時傳遞的是引用(相當於指針)。也就是說函數內對參數所做的修改會影響原來的數組。
4.String類型(引用)作爲參數傳遞時傳遞的是引用,只是對String做出任何修改時有一個新的String對象會產生,原來的String對象的值不會做任何修改。(但是可以將新的對象的 引用賦給原來的引用,這樣給人的表面現象就是原來的對象變了,其實沒有變,只是原來指向它的引用指向了新的對象)。
補充:
1.有些時候參數傳遞到函數中,原參數的值是會修改的,如數組和變長數組、對象等;有些值是不會修改的,如int、float等簡單變量。道理簡單,但是在實際編寫中常常會忘記這一點導致程序莫名其妙報錯。
2.如果你想傳遞一個參數(該參數爲“傳遞引用”,即在函數中修改該變量會影響原先的值),並且不想讓原來的值變化,可以用 變量名.clone()這個函數,非常好用的一個函數,該函數會“克隆”一個完全相同的數組、對象等,並且修改該克隆變量不會影響原先的值。
3.
- package StringTest;
- class A{
- int a=1;
- char b='A';
- public A(){}
- public A(int _a,char _b){
- this.a=_a;
- this.b=_b;
- }
- public String toString(){
- return "a="+this.a+",b="+this.b;
- }
- }
- public class ReferenceTest {
- public static A changeA(A classa){
- classa.a=2;
- classa.b='B';
- return classa;
- }
- public static String changeString(String str){
- System.out.println(str.hashCode());
- str=str.toLowerCase();
- System.out.println(str.hashCode());
- return str;
- }
- public static int changeint(int a){
- a=a+1;
- return a;
- }
- public static Integer changeInteger(Integer a){
- a=new Integer(9);
- return a;
- }
- public static int[] changeintarray(int a[]){
- a[0]=10;
- return a;
- }
- public static void printArray(int a[]){
- for(int i=0;i<a.length;i++){
- System.out.print(a[i]+" ");
- }
- System.out.println();
- }
- public static void main(String[] args) {
- //自定義的對象傳遞的是引用
- A a=new A();
- A b=changeA(a);
- System.out.println(a);
- System.out.println(b);
- System.out.println("----------------------");
- //String對象作爲參數傳遞的也是引用(只是String對象的值不能變,每一個修改String對象的值都會重新創建一個新的String對象用以保存修改後的值,原來的值不會變)
- String str1="HUHUALIANG";
- System.out.println(str1.hashCode());
- String str2=changeString(str1);
- System.out.println(str2.hashCode());
- System.out.println(str1);
- System.out.println(str2);
- System.out.println("----------------------");
- //基本類型是值傳遞
- int inta=8;
- int intb=changeint(inta);
- System.out.println(inta);
- System.out.println(intb);
- System.out.println("----------------------");
- //基本類型的包裝集作爲參數傳遞的是值而不是引用
- Integer c=new Integer(1);
- Integer d=changeInteger(c);
- System.out.println(c);
- System.out.println(d);
- System.out.println("----------------------");
- //數組傳遞的是引用
- int [] arraya={0,1,2,3};
- int [] arrayb=changeintarray(arraya);
- printArray(arraya);
- printArray(arrayb);
- }
- }
a=2,b=B
a=2,b=B
----------------------
711139030
711139030
226046678
226046678
HUHUALIANG
huhualiang
----------------------
8
9
----------------------
1
9
----------------------
10 1 2 3
10 1 2 3