Java面向對象程序設計第5章1-9

1.面向對象的主要特徵是什麼?

三大特徵是:封裝、繼承和多態
封裝:是指將某事物的屬性和行爲包裝到對象中,這個對象只對外公佈須要公開的屬性和行爲,而這個公佈也是能夠有選擇性的公佈給其它對象。
繼承:是子對象能夠繼承父對象的屬性和行爲,亦即父對象擁有的屬性和行爲,其子對象也就擁有了這些屬性和行爲。
多態性:是指容許不一樣類的對象對同一消息做出響應。多態性語言具備靈活、抽象、行爲共享、代碼共享的優點,很好的解決了應用程序函數同名問題。java

2.封裝是如何實現的?

封裝是將對象的信息隱藏在對象內部,禁止外部程序直接訪問對象內部的屬性和方法。
java封裝類經過三個步驟實現:安全

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

3.對象之間如何相互做用?做用的條件是什麼?

經過封裝與組合來設計,具備「高內聚,低耦合」的特色。好比A類裏有B類的引用,則A的實例對象就能夠當作B的實例對象組合而成。函數

4.protected修飾符有何特色?

protected這個修飾符,各大參考書都會這樣說:訪問權限爲類內,包內和子類,所以在父類中定義的方法和成員變量若是爲protected修飾的,同包中任意訪問,只有父類聲明爲public時不一樣包的子類也能夠訪問。this

5.Object都有哪些方法?

Object类的函数

1.Object clone()

將當前對象克隆,保護方法,實現對象的淺複製,只有實現了Cloneable接口才能夠調用該方法,不然拋出CloneNotSupportedException異常。線程

主要是JAVA裏除了8種基本類型傳參數是值傳遞,其餘的類對象傳參數都是引用傳遞,咱們有時候不但願在方法裏講參數改變,這是就須要在類中複寫clone方法。設計

2.Class getClass()

得到當前的類對象code

3.String toString()

獲得表明這個對象的字符串,通常子類都有覆蓋。對象

4.void finalize()

對象被釋放時使用,由於沒法肯定該方法何時被調用,不多使用。blog

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
    }
}

結尾:

之後有補充再來改~~~

相關文章
相關標籤/搜索