1. 程式人生 > >Java基礎教程(11)--對象

Java基礎教程(11)--對象

虛擬 接受 完成 垃圾 end tlist 基本 pre http

一.創建對象

??下面的語句創建了一個對象並把它的引用賦值給了一個變量:

Point originOne = new Point(23, 94);

??這條語句由三部分組成(下面將詳細討論):

  1. 聲明對象變量:聲明一個可以引用稍後創建的對象的變量。
  2. 實例化類:new關鍵字是實例化類的操作符。
  3. 初始化對象:new從操作符將會調用類的構造器,從而完成對象的初始化。

1.聲明對象變量

??就像聲明基本數據類型的變量一樣,聲明對象變量的語法如下:

ClassName variableName;

??這會告訴編譯器variableName將會用來引用一個ClassName類的對象。在使用這個變量之前,必須將一個對象的引用賦值給它,否則將會造成編譯錯誤。

2.實例化類

??new操作符通過為對象分配內存並返回對這塊內存的引用來實例化一個類。new操作符還會調用構造方法。
??new操作符後需要一個對構造方法的調用。構造方法的名字也就是需要實例化的類的名字。
??可以不將new操作符返回的引用賦值給變量,它可以直接用在表達式中:

int x = new Point(1, 5).getX();

3.初始化對象

??下面是Point類的代碼:

public class Point {
    public int x = 0;
    public int y = 0;
    //constructor
    public Point(int a, int b) {
        x = a;
        y = b;
    }
}

??Point類包含一個構造方法。這個構造方法接受兩個整數參數,下面的代碼提供23和94作為這些參數的值:

Point originOne = new Point(23, 94);

??這條語句的結果可以用下面這張圖說明:
技術分享圖片
??下面是RectAngle類的代碼,這個類有四個構造方法:

public class Rectangle {
    public int width = 0;
    public int height = 0;
    public Point origin;

    // four constructors
    public Rectangle() {
        origin = new Point(0, 0);
    }
    public Rectangle(Point p) {
        origin = p;
    }
    public Rectangle(int w, int h) {
        origin = new Point(0, 0);
        width = w;
        height = h;
    }
    public Rectangle(Point p, int w, int h) {
        origin = p;
        width = w;
        height = h;
    }

    // a method for moving the rectangle
    public void move(int x, int y) {
        origin.x = x;
        origin.y = y;
    }

    // a method for computing the area of the rectangle
    public int getArea() {
        return width * height;
    }
}

??如果一個類有多個構造方法,則它們必須具有不同的簽名。Java編譯器根據參數的數量和類型區分構造方法。下面的代碼創建了一個Point類的對象,並使用它和另外兩個整數作為參數來創建一個RectAngle類的對象:

Point originOne = new Point(23, 94);
Rectangle rectOne = new Rectangle(originOne,100,200);

??這條語句的結果可以用下面這張圖說明:
技術分享圖片
??所有類至少有一個構造方法。如果類沒有提供構造方法,則Java編譯器會自動提供一個無參構造方法,稱為默認構造方法。此默認構造方法會調用類父級的無參構造方法。如果類沒有使用extends關鍵字直接繼承父類,這個類將會有一個隱含的父類——Object類,它有一個無參構造方法。如果類使用extends關鍵字繼承了父類,但是父類沒有無參構造方法,編譯器將會給出錯誤。
??如果類提供的構造方法裏不包括無參構造方法,編譯器將不會自動提供無參構造方法。此時使用無參構造方法初始化對象將會產生一個錯誤。

二.使用對象

??創建了一個對象之後,我們可以在接下來的代碼中去使用它。可能是獲取某個域的值,或者改變某個域的值,也可能是通過調用某個方法去執行一些操作。
??使用以下的語法來訪問一個對象的域:

objectReference.fieldName

??對於上面的rectOne所引用的對象來說,我們可以以如下方式去訪問它的height域:

rectOne.height

??使用以下的語法來調用一個對象的方法:

objectReference.methodName(argumentList)

??下面的語句調用了rectOne所引用的對象的getArea方法並將返回值賦值給了一個變量:

int area = rectOne.getArea();

垃圾回收

??某些語言要求您跟蹤所創建的所有對象,並在不再需要時明確銷毀它們。明確地管理內存是乏味且容易出錯的。Java虛擬機在確定一個對象不再使用時刪除這個對象。這個過程稱為垃圾回收。
??當沒有對該對象的引用時,虛擬機有資格對該對象進行垃圾回收。可以通過將變量設置為null來顯式取消對該對象的引用。需要註意的是,程序可以對同一對象進行多次引用,在對象符合垃圾回收條件之前,必須刪除對對象的所有引用。

Java基礎教程(11)--對象