Java參數(shù)按值傳遞?按引用傳遞
有時候在想,java在調(diào)用方法時候究竟是按值傳遞還是按引用傳遞,之前有人說是基本數(shù)據(jù)類型按值傳遞,引用類型按引用傳遞。一時間,似乎都有道理。
筆者在此不追究字眼上的辨別識字能力,把自己對這個問題的理解闡述一下,筆者不想說這是按值傳遞還是按引用傳遞,自己理解就好了吧,畢竟java會用才是王道。
先看一下下面的代碼:
- package shb.java.testmemory;
- public class TestMeo {
- /**測試基本數(shù)據(jù)類型以及引用類型參數(shù)按值傳遞
- * @Description:
- * @author shaobn
- * @param args
- * @Date:2015-9-8 上午7:53:56
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- testInt();
- testStr();
- testPack();
- testObj();
- testObj_2();
- }
- //NO1.測試基本數(shù)據(jù)類型
- public static void testInt(){
- int num1 = 12;
- System.out.println("Before change::"+num1);
- changeInt(num1);
- System.out.println("After change::"+num1);
- }
- //測試字符串類型
- public static void testStr(){
- String str = "helloworld";
- System.out.println("Before change::"+str);
- changeStr(str);
- System.out.println("After change::"+str);
- }
- //測試包裝類型
- public static void testPack(){
- Integer integer = new Integer(42);
- System.out.println("Before change::"+integer);
- changePack(integer);
- System.out.println("After change::"+integer);
- }
- //測試引用類型
- public static void testObj(){
- Person person = new Person();
- System.out.println("Before change::"+person.age);
- changeObj(person);
- System.out.println("After change::"+person.age);
- }
- //測試引用類型方式二
- public static void testObj_2(){
- Person person = new Person();
- System.out.println("Before change::"+person.age);
- changeObj_2(person);
- System.out.println("After change::"+person.age);
- }
- public static void changeInt(int num){
- num = 21;
- }
- public static void changeStr(String str){
- str = "hellobeijing";
- }
- public static void changePack(Integer integer){
- integer = new Integer(89);
- }
- public static void changeObj(Person person){
- person.age = 87;
- }
- public static void changeObj_2(Person person){
- person = new Person();
- person.age = 78;
- }
- }
- //引用類型測試類
- class Person{
- public int age = 78;
- }
Look NO1:
說明一下:筆者在上面畫的兩張圖著實不咋樣,只能做到這種程度了。我們分析一下:當數(shù)據(jù)為基本數(shù)據(jù)類型時,我們傳給形參的僅僅是一個實參的副本(Copy),當然由于棧內(nèi)存變量共享的特征,這兩個變量共同指向此變量值。
當我們對形參進行改變時,首先,在棧內(nèi)存中會尋找是否存在新的變量值,如果有,則指向新的變量值(體現(xiàn)棧內(nèi)存數(shù)據(jù)共享的特點)。如果沒有的話,在棧內(nèi)存中回開辟一塊空間,存儲新的變量值,同時形參變量會指向新的變量值。
此時我們發(fā)現(xiàn),這時的變量值已經(jīng)與實參的變量沒有關系,兩個獨立的變量。所以經(jīng)過函數(shù)后改變的變量值與之前的沒有關系,故輸出的還是之前的變量值。
另外,我們看到,當傳遞對象的引用時,person引用變量中存儲的是Person對象在堆內(nèi)存中的內(nèi)存地址,所以傳遞的是內(nèi)存地址(筆者理解為是一串數(shù)字)。此時兩個形參變量是有共同的內(nèi)存地址值,所以指向同一個內(nèi)存對象。我們觀察
發(fā)現(xiàn),當我們改變對象中的屬性值時,有牽一發(fā)而動全身的感覺,只要你改變這個對象,這個對象就被改變,而不存在另外開辟一個對象的概念(String類型和包裝類型除外)。
PS:還沒有寫完,正在上班時間,晚上再寫吧!
如有錯誤,請大家?guī)兔m正一下。