天天看點

Java朝花夕拾の基本類型和引用類型

Java中資料類型可分為兩大類:引用類型(reference)和基本類型(primitive)。

1)基本類型

基本類型有8種:boolean、char、byte、short、int、long、float、double。它們都有相應的包裝類,這些包裝類都屬于引用類型,它們依次是:Boolean、Character、Byte、Short、Integer、Long、Float、Double。

2)引用類型

所有Java對象都是通過對象引用(Object References)進行通路的,類似于C++中的指針,這個引用指向堆heap中的某塊區域,實際的對象存在于heap中。

例如,聲明如下代碼:

int prim = 10;

Integer refer = new Integer(10);

這兩者在記憶體中的布局如下圖所示:

至此,有人可能會想:當這兩種類型作為函數參數傳遞時,到底是值傳遞(value)還是引用傳遞(reference),還是兩種類型各自為政?其實Java中的函數參數都是以值方式傳遞的。見代碼片段:

import java.awt.Point;

/**
 * Java中參數都以傳值方式傳遞,而不是傳引用方式傳遞
 * @author ASCE1885
 *
 */
public class PassByValue {
  
  public static void modifyPoint(Point pt, int in) {
    //這裡的pt是入參pt的引用的副本,而不是入參pt的副本,即Java以傳值方式傳遞pt的引用
    //也就是說,pt和入參pt現在指向的是同一個Point對象,詳見圖示
    pt.setLocation(5, 5);
    in = 15; //這裡的in其實是入參in的一個副本,所有的更改都是對in而言,跟入參in無關
    System.out.println("During modifyPoint " + "pt = " + pt + "and in = " + in);
  }
  
  public static void main(String[] args) {
    Point p = new Point(0,0);
    int i = 10;
    
    System.out.println("Before modifyPoint " + "p = " + p + "and i = " + i);
    modifyPoint(p, i);
    System.out.println("After modifyPoint " + "p = " + p + "and i = " + i);
    
  }

}      

上面代碼的輸出是: