Java基礎教程(11)--物件
一.建立物件
下面的語句建立了一個物件並把它的引用賦值給了一個變數:
Point originOne = new Point(23, 94);
這條語句由三部分組成(下面將詳細討論):
- 宣告物件變數:宣告一個可以引用稍後建立的物件的變數。
- 例項化類:new關鍵字是例項化類的操作符。
- 初始化物件: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來顯式取消對該物件的引用。需要注意的是,程式可以對同一物件進行多次引用,在物件符合垃圾回收條件之前,必須刪除對物件的所有引用。