看到Objects and Classes這一章了,開始系統地接觸OOP的思想,而不像以前用Delphi只是憑感覺地寫程序。
1. 構造函數(Constructor)前不能有void修飾符。
2. instance variable, instance method, anonymous object 的概念
3. 要測試某個類的代碼是否正確時,只要簡單地加入一個main方法即可。
4. 類的數據域(data field)中的類型在定義時會被自動賦予一個默認值,但程序中的變量在定義后卻并不會被賦初值。
class Student {
String name; //默認賦 null
int age; //默認賦 0
//....
}
class Test {
//...
public static void main(Strings[] args) {
int x; //不賦初值
//...
}
}
5. public private 和 package-private 訪問權限
public 修飾語使得類、方法、數據域均能被任何一個類訪問
private 保護方法和數據域,使它們只能被該類自身訪問
無修飾語則默認為package-private,即類、方法、數據域只能被同一個package的任何類訪問。
一般來講,構造函數應該聲名為public,但要阻止用戶創建一個類的實例(instance)時,構造函數就應該聲名為private,如Math類。
6. client 的概念 (programs that use a specific class)
當修改某個類以后,意味著對這個類的數據域具有直接訪問權的client的代碼也很有可能需要修改,為了減少這種工作量,引入數據封裝的概念(data field encapsulation)。
即將數據域設為private,對于需要訪問的數據增加getPropertyName()方法,類似地,對于需要修改的數據增加setPropertyName(dataType propertyValue)方法。這兩個方法能夠起到一種“過濾”的作用(至少我是這么理解的 =_=)。
getPropertyName 方法稱為 accessor,setPropertyName 方法稱為 mutator。
當某個類在創建后,它的內容就無法修改,這個類稱為 immutable class,類似可以定義 immutable object。
當一個類所有的數據都是private,也不存在 mutator時,并不一定 immutable。
可以通過
propertyType value = objectA.getPropertyType()
由于value所在的那個類可能存在mutator,因此就可以通過value句柄(Delphi里經??吹降男g語,覺得用這個詞比較形象)修改objectA的內容,感覺有點像 hacking....
7. 靜態(static)變量、方法的概念
注意static方法中不能引用instance變量,因為static方法屬于整個類,而不僅局限于某個實例。
8. 變量的作用域
和Pascal C 都差不多,內框架的變量覆蓋外框架的同名變量。
但是Java多了 this 關鍵字(不知道C++有沒有類似的),可以訪問外框架的同名變量。
一個好的編程風格:在實現(implement)構造函數的時候,盡可能多的使用 this(arg-list),增強程序的可讀性。注意Java要求在構造函數中this語句出現在其他語句的前面。
public class Circle {
private double radius;
public Circle(double raduis) {
this.radius = radius;
}
pubic Circle() {
this(1.0);
}
}