深入學習java原始碼之基本型別與引用型別
阿新 • • 發佈:2019-01-05
深入學習java原始碼之基本型別與引用型別
Java中的變數分為基本型別和引用型別兩種。基本型別的變數儲存數值本身,而引用型別的變數儲存的是引用值,即指向記憶體空間的地址。
基本型別包括:byte,char,int short,long,float,double,boolean;
引用型別包括:類型別,介面型別和陣列。
基本型別在宣告其變數時就為它分配了空間:
int value;
value = 10;//正確,因為宣告a時就分配了空間
而引用不同,在進行引用的宣告時只給變數聲明瞭引用空間,而不分配資料空間:
Date date; //執行例項化,開闢資料空間存放Date物件,然後把空間的首地址傳給today變數 //date=new Date(); //如果註釋掉上一步操作 //The local variable date may not have been initialized //也就是說物件的資料空間沒有分配 date.getDate(); //初始化過程如下: Date a,b; //在記憶體開闢兩個引用空間 a = new Date();//開闢儲存Date物件的資料空間,並把該空間的首地址賦給a b = a; //將a儲存空間中的地址寫到b的儲存空間中
引用也是佔用空間,一個空物件的引用大小大概是4byte。
*值傳遞:方法呼叫時,實際引數將它的值傳遞給對應的形式引數,函式接收到的是原始值的副本,此時記憶體中存在兩個相等的基本型別,若方法中對形參執行處理操作,並不會影響實際引數的值。
*引用傳遞:方法呼叫時,實際引數的引用(是指地址,而不是引數的值)被傳遞給方法中相應的形式引數,函式接收到的是原始值的記憶體地址,在方法中,形參與實參的內容相同,方法中對形參的處理會影響實參的值。
public class ReferencePkValue2 { public static void main(String[] args) { ReferencePkValue2 t = new ReferencePkValue2(); int a=99; t.test1(a);//這裡傳遞的引數a就是按值傳遞 System.out.println(a); MyObj obj=new MyObj(); t.test2(obj);//這裡傳遞的引數obj就是引用傳遞 System.out.println(obj.b); } public void test1(int a){ a=a++; System.out.println(a); } public void test2(MyObj obj){ obj.b=100; System.out.println(obj.b); } } 100 99 100 100
這裡要特殊考慮String,以及Integer、Double等幾個基本型別包裝類,它們都是immutable型別,
因為沒有提供自身修改的函式,每次操作都是新生成一個物件,所以要特殊對待,可以認為是和基本資料型別相似,傳值操作。
結論
1)形參為基本型別時,對形參的處理不會影響實參。
2)形參為引用型別時,對形參的處理會影響實參。
3)String,Integer,Double等immutable型別的特殊處理,可以理解為值傳遞,形參操作不會影響實參物件。