標籤:
這是小弟的第一篇部落格,寫得不好還請看官見諒哈!
java 有兩種資料類型:基礎資料型別 (Elementary Data Type)(int,short,long,byte,float,double,boolean,char),引用資料類型(基礎資料型別 (Elementary Data Type)之外的數組,String,對象等等)。
在方法中傳參數有兩種方式:值傳遞和引用傳遞
先看下面的一個執行個體。
public class Stu {String name;int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}public class Test {protected static void updateStu(Stu stu) {stu.setAge(5);stu.setName("Li");//stu=new Stu();//stu.setAge(5);//stu.setName("Li");//用上面注釋的代碼替換掉未注釋,修改前後的stu是一樣的,即3,zhang}protected static void updateStr(String str) {str=new String("update");//str="update";//這兩行代碼效果一樣}protected static void updateInteger(Integer i) {i=10;}protected static void updateBasic(int i) {i=10;}protected static void updateArray(int[] test) {if(test.length>1)test[0]=10;}protected static void updateCharArray(char[] cs) {cs=new char[3];cs[0]=‘a‘;cs[1]=‘b‘;cs[2]=‘c‘;}public static void main(String[] args){Stu stu=new Stu();stu.setAge(3);stu.setName("Zhang");System.out.println("1-----------當方法參數為普通對象");System.out.println("初始值");System.out.println(stu.getAge());System.out.println(stu.getName());updateStu(stu);System.out.println("修改後");System.out.println(stu.getAge());System.out.println(stu.getName());System.out.println("2-----------當方法參數為String");String str1=new String("haha");String str2="hehe";System.out.println("初始值");System.out.println(str1);System.out.println(str2);updateStr(str1);updateStr(str2);System.out.println("修改後");System.out.println(str1);System.out.println(str2);System.out.println("3-----------當方法參數為Integer");Integer integer=new Integer(5);System.out.println("初始值");System.out.println(integer);updateInteger(integer);System.out.println("修改後");System.out.println(integer);System.out.println("4-----------當方法參數為八種基本類型");int t=5;System.out.println("初始值");System.out.println(t);updateBasic(t);System.out.println("修改後");System.out.println(t);System.out.println("5-----------當方法參數為整數數組");int[] test ={1,2,3};System.out.println("初始值");System.out.println(test[0]+"--"+test[1]+"--"+test[2]);updateArray(test);System.out.println("修改後");System.out.println(test[0]+"--"+test[1]+"--"+test[2]);System.out.println("6-----------當方法參數為字元數組");char[] cs ={‘1‘,‘2‘,‘3‘};System.out.println("初始值");System.out.println(cs);updateCharArray(cs);System.out.println("修改後");System.out.println(cs);}}
=======================================輸出
1-----------當方法參數為普通對象
初始值
3
Zhang
修改後
5
Li
2-----------當方法參數為String
初始值
haha
hehe
修改後
haha
hehe
3-----------當方法參數為Integer
初始值
5
修改後
5
4-----------當方法參數為八種基本類型
初始值
5
修改後
5
5-----------當方法參數為整數數組
初始值
1--2--3
修改後
10--2--3
6-----------當方法參數為字元數組
初始值
123
修改後
123
根據上面的結果,可以得出這樣的結論
1、基礎資料型別 (Elementary Data Type)採用的是值傳遞,(類似C裡面的傳值),它不會修改實參的值
2、引用資料類型採用的是引用傳遞,(類似C裡面的傳指標),引用可以理解成JAVA的指標,它指向對象在堆裡面分配的首地址
3、String修改後為什麼實參沒變,這個我看過很多文章說String就相當於是char[]的封裝類。封裝類的特質之一就是在對其值進行操作時會體現出其對應的基本類型的性質。
但是小弟有另一番理解:str="update",這句話會有有如下動作,在棧裡面尋找有沒有value="update"的String引用,要是有就將str指向堆裡面的該地址,要是沒有就會重新建立一個String對象"update",並將str指向該對象在堆中的地址。在上面的執行個體中,調用updateStr方法,會將str的引用賦給形參str,而在這個方法中str又重新指向了另一個String對象,但是這個過程並沒有修改實參所指向的String對象,這個就和updateStu方法一樣,只要new了一個新的對象,那麼實參指向的對象就不會改變。
java 方法傳參