1. 程式人生 > >Java面向物件程式設計第5章1-9

Java面向物件程式設計第5章1-9

1.面向物件的主要特徵是什麼?

三大特徵是:封裝、繼承和多型
封裝:是指將某事物的屬性和行為包裝到物件中,這個物件只對外公佈需要公開的屬性和行為,而這個公佈也是可以有選擇性的公佈給其它物件。
繼承:是子物件可以繼承父物件的屬性和行為,亦即父物件擁有的屬性和行為,其子物件也就擁有了這些屬性和行為。
多型性:是指允許不同類的物件對同一訊息作出響應。多型性語言具有靈活、抽象、行為共享、程式碼共享的優勢,很好的解決了應用程式函式同名問題。

2.封裝是如何實現的?

封裝是將物件的資訊隱藏在物件內部,禁止外部程式直接訪問物件內部的屬性和方法。
java封裝類通過三個步驟實現:

  1. 修改屬性的可見性,限制訪問。
  2. 設定屬性的讀取方法。
  3. 在讀取屬性的方法中,新增對屬性讀取的限制。

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)設定一個超時間隔,如果在規定時間內沒有獲得鎖就返回。
呼叫該方法後當前執行緒進入睡眠狀態,直到以下事件發生。

  1. 其他執行緒呼叫了該物件的notify方法。

  2. 其他執行緒呼叫了該物件的notifyAll方法。

  3. 其他執行緒呼叫了interrupt中斷該執行緒。

  4. 時間間隔到了。

    此時該執行緒就可以被排程了,如果是被中斷的話就丟擲一個InterruptedException異常。

8.notify

用於執行緒同步中喚醒等待的執行緒

9.notifyAll

用於執行緒同步中喚醒等待的所有執行緒

6.過載的方法之間一般有什麼關係?

方法名稱相同,引數型別或個數不同,可以看成過載的方法是一個方法的兩種實現,僅有返回型別不同,則編譯不能通過

7.子類覆蓋父類方法需要什麼條件?子類中定義與父類同名的方法一定是覆蓋嗎?

條件:

  1. 子類的訪問修飾符許可權應等於或大於父類
  2. 同名的static方法和非static方法不能相互覆蓋
  3. 方法前有final修飾符,此方法不能在子類方法中進行覆蓋
  4. 在JDK中,很多父類的方法被子類重新覆蓋,賦予了不同的含義,如Object類中的boolean equals(Object obj)方法
  5. 抽象類中如果存在抽象方法,則具體子類必須對抽象方法進行覆蓋

不一定:

子類和父類的方法必須是例項方法,如果父類是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
    }
}

結尾:

以後有補充再來改