java 方法传参
這是小弟的第一篇博客,寫得不好還請看官見諒哈!
java 有兩種數據類型:基本數據類型(int,short,long,byte,float,double,boolean,char),引用數據類型(基本數據類型之外的數組,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、基本數據類型采用的是值傳遞,(類似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了一個新的對象,那么實參指向的對象就不會改變。
?
public static void main(String[] args) throws Exception{Demo demo=new Demo(5);changeDemo(demo);System.out.println(demo.val);setDemo(demo);System.out.println(demo.val);}public static void changeDemo(Demo demo){demo=new Demo(6);}public static void setDemo(Demo demo){demo.setVal(6);}static class Demo{int val;Demo(int val){this.val=val;}public void setVal(int val){this.val=val;}}輸出
5 6從上面的例子可以看出setDemo將形參引用指向了一個新的對象,它的值是6,但是這個并沒有改變實參的值,說明函數傳遞的并非實參引用本身,而是實參引用的一份拷貝。
setValue,通過形參引用來改變實參的值,是因為,此時實參引用和形參引用指向的是同一對象。
轉載于:https://www.cnblogs.com/maydow/p/4460900.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
- 上一篇: 第二十五天 how can I 坚持
- 下一篇: GridCtrl学习笔记(2)寻找自动更