Java面向物件程式設計第5章1-9
1.面向物件的主要特徵是什麼?
三大特徵是:封裝、繼承和多型。
封裝:是指將某事物的屬性和行為包裝到物件中,這個物件只對外公佈需要公開的屬性和行為,而這個公佈也是可以有選擇性的公佈給其它物件。
繼承:是子物件可以繼承父物件的屬性和行為,亦即父物件擁有的屬性和行為,其子物件也就擁有了這些屬性和行為。
多型性:是指允許不同類的物件對同一訊息作出響應。多型性語言具有靈活、抽象、行為共享、程式碼共享的優勢,很好的解決了應用程式函式同名問題。
2.封裝是如何實現的?
封裝是將物件的資訊隱藏在物件內部,禁止外部程式直接訪問物件內部的屬性和方法。
java封裝類通過三個步驟實現:
- 修改屬性的可見性,限制訪問。
- 設定屬性的讀取方法。
- 在讀取屬性的方法中,新增對屬性讀取的限制。
3.物件之間如何相互作用?作用的條件是什麼?
通過封裝與組合來設計,具有“高內聚,低耦合”的特點。比如A類裡有B類的引用,則A的例項物件就可以看成B的例項物件組合而成。
4.protected修飾符有何特點?
protected這個修飾符,各大參考書都會這樣說:訪問許可權為類內,包內和子類,因此在父類中定義的方法和成員變數如果為protected修飾的,同包中任意訪問,只有父類宣告為public時不同包的子類也可以訪問。
5.Object都有哪些方法?
1.Object clone()
將當前物件克隆,保護方法,實現物件的淺複製,只有實現了Cloneable接口才可以呼叫該方法,否則丟擲CloneNotSupportedException異常。
主要是JAVA裡除了8種基本型別傳引數是值傳遞,其他的類物件傳引數都是引用傳遞,我們有時候不希望在方法裡講引數改變,這是就需要在類中複寫clone方法。
2.Class getClass()
獲得當前的類物件
3.String toString()
得到代表這個物件的字串,一般子類都有覆蓋。
4.void finalize()
物件被釋放時使用,因為無法確定該方法什麼時候被呼叫,很少使用。
5.Boolean equals()
判斷兩個引用是否指向同一個物件,其引數不能為普通資料型別
6.int hashCode()
得到代表物件的一個整數,這個整數在應用程式執行時保持不變
7.void wait()
應用於執行緒同步中的執行緒等待
wait方法就是使當前執行緒等待該物件的鎖,當前執行緒必須是該物件的擁有者,也就是具有該物件的鎖。wait()方法一直等待,直到獲得鎖或者被中斷。wait(long timeout)設定一個超時間隔,如果在規定時間內沒有獲得鎖就返回。
呼叫該方法後當前執行緒進入睡眠狀態,直到以下事件發生。
其他執行緒呼叫了該物件的notify方法。
其他執行緒呼叫了該物件的notifyAll方法。
其他執行緒呼叫了interrupt中斷該執行緒。
時間間隔到了。
此時該執行緒就可以被排程了,如果是被中斷的話就丟擲一個InterruptedException異常。
8.notify
用於執行緒同步中喚醒等待的執行緒
9.notifyAll
用於執行緒同步中喚醒等待的所有執行緒
6.過載的方法之間一般有什麼關係?
方法名稱相同,引數型別或個數不同,可以看成過載的方法是一個方法的兩種實現,僅有返回型別不同,則編譯不能通過
7.子類覆蓋父類方法需要什麼條件?子類中定義與父類同名的方法一定是覆蓋嗎?
條件:
- 子類的訪問修飾符許可權應等於或大於父類
- 同名的static方法和非static方法不能相互覆蓋
- 方法前有final修飾符,此方法不能在子類方法中進行覆蓋
- 在JDK中,很多父類的方法被子類重新覆蓋,賦予了不同的含義,如Object類中的boolean equals(Object obj)方法
- 抽象類中如果存在抽象方法,則具體子類必須對抽象方法進行覆蓋
不一定:
子類和父類的方法必須是例項方法,如果父類是static方法而子類不是例項方法,或者相反都會報錯。
如果父類和子類都是static方法,那麼子類重寫或者覆蓋父類方法。
8.封裝、繼承與多型在面向物件程式設計中的用途是什麼?
封裝使得內部實現對使用者隱藏,有利於安全操作,繼承可以實現物件之間的共性與特性,多型性更貼近人的使用習慣,使程式更方便。
9.設計Src和Dis兩個類,Src中有一個被封裝的屬性,型別為int(要求為非負值),每當通過特定方法更改Src物件中的這個屬性後,Dis物件都能得到通知,並向Src發訊息獲得此屬性值。
class Dis {
int val;
public Dis(int con_val){
val = con_val;
}
public void monitor() {
System.out.println("the value of Src has changed");
}
}
class Src{
Dis dis;//組合dis
int value;
public Src(Dis con_dis) {
value = con_dis.val >= 0 ? con_dis.val : 0;//保證value非負
this.dis=con_dis;//Src物件中擁有了Dis物件的引用
}
public void valueChange() {
for (int i = 0; i < 2; i++) {
int oldvalue = value;
value += i;
if (oldvalue != value){
dis.monitor();//只改變了一次
}
}
}
}
public class test {
public static void main(String[] args) {
Dis dis=new Dis(666);
Src src=new Src(dis);//建立src物件,並將src物件作為引數傳入
src.valueChange();//the value of Src has changed
}
}
結尾:
以後有補充再來改