1. 程式人生 > >深入學習java原始碼之基本型別與引用型別

深入學習java原始碼之基本型別與引用型別

深入學習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型別的特殊處理,可以理解為值傳遞,形參操作不會影響實參物件。