Think in java第七章筆記

2021-06-22 18:27:33 字數 3797 閱讀 4557

1.通過繼承可將乙個物件當做它自己的型別或者它自己的基礎型別對待。這種能力是非常重要的,因為多個型別(從相同的基礎類中衍生出來)可被當做同一型別對待。而且只需要一段**,即可對所有不同的型別進行同樣的處理。

2.將乙個方法呼叫同乙個方法主體連線到一起就稱為繫結。若一種語言實現了動態繫結,同時必須提供一些機制,可在執行期間判斷物件的型別,並分別呼叫適當的方法。也就是說,編譯器此時依然不知道物件的型別,但方法呼叫機制能自己去調查,找到正確的方法主體。不同的語言對動態繫結的實現時由區別的。但它們都要在物件中安插某些特殊型別的資訊。

3.為什麼要把乙個方法宣告成final呢?它能防止其他人覆蓋那個方法。更重要的是,它可有效的"關閉"動態繫結,或者告訴編譯器不需要進行動態繫結。這樣就可為final方法呼叫生成效率更高的**。

4.使用動態繫結後,所有的衍生類都能保證用相同的**正常的工作。我們可以"將一條訊息傳送給乙個物件,讓物件自行判斷要做什麼事情"。

5.包含了抽象方法的乙個類叫做"抽象類"。如果乙個類裡包含了乙個或多個抽象方法,類就必須指定成abstract。如果從乙個抽象類繼承,而且想生成新型別的乙個物件,就必須為基礎類中的所有抽象方法提供方法定義。

6.可決定將乙個介面中的方法宣告明確定義為"public"。但即使不明確定義,它們也會預設為public。所以在實現乙個介面的時候,來自介面的方法必須定義成public。否則,它們會預設為"友好的"。

7.

inte***ce canfight 

inte***ce canswim

inte***ce canfly

class actioncharacter

}class hero extends actioncharacter implements canfight, canswim, canfly

public void fly()

}public class adventure

static void u(canswim x)

static void v(canfly x)

static void w(actioncharacter x)

public static void main(string args)

}

儘管hero沒有為fight明確地提供乙個定義,但定義時隨同actioncharacter來的,所以這個定義會自動提供,我們可以建立hero的物件。

介面的作用:能上溯至多個基礎型別;防止客戶程式設計師製作這個類的乙個物件。如果事先知道某種東西會成為基礎類,那麼第乙個選擇就是把它變成乙個介面。只有在必須使用方法定義或者成員變數的時候,才應考慮採用抽象類。

8.

inte***ce content 

class contents implements content

}public class parcel6

};} public static void main(string args)

}

return new contents() 

}

要表達的意思是:建立從contents衍生出來的匿名類的乙個物件。由new表示式返回的控制代碼會自動上溯造型成乙個contents控制代碼。匿名內部類的語法其實要表達的是:

class mycontents extends contents 

}return new mycontents();

9.

class destination 

public class parcel8

};} public static void main(string args)

}

若試圖定義乙個匿名內部類,並想使用在匿名內部類外部定義的乙個物件,則編譯器要求外部物件為final屬性。

10.建立自己的內部類時,那個類的物件同時擁有指向封裝物件的乙個鏈結。所以能訪問那個封裝物件的成員。

11.

class withinner 

}public class inheritinner extends withinner.inner

/*inheritinner() */

public static void main(string args)

}

內部類構建器必須同封裝類的物件的乙個控制代碼聯絡到一起。從乙個內部類繼承的時候,情況會變得複雜。封裝類的"秘密"控制代碼必須獲得初始化,而且在衍生類中不再有乙個預設的物件可以連線。

12.

class egg2 

public void f()

} private yolk y = new yolk();

public egg2()

public void insertyolk(yolk yy)

public void g()

}public class bigegg2 extends egg2

public void f()

} public bigegg2()

public static void main(string args)

}

輸出為:

egg2.yolk()

new egg2()

egg2.yolk()

bigegg2.yolk()

bigegg2.yolh.f()

13.由於每個類都會生成乙個.class檔案,用於容納如何建立這個型別的物件有關的所有資訊(這種資訊產生了乙個名為class物件的元類)。內部類也必須生成相應的.class檔案,用來容納它們的class物件的有關資訊。這些檔案或類的名字遵守一種嚴格的形式:先是封裝雷丁額名字,再跟隨乙個¥,再跟隨內部類的名字。

14.

class meal

}class bread

}class cheese

}class lettuce

}class lunch extends meal

}class portablelunch extends lunch

}public class sandwitch extends portablelunch

public static void main(string args)

}

meal()

lunch()

portablelunch()

bread()

cheese()

lettuce()

sandwitch

對於乙個複雜的物件,構建器的呼叫遵循:

(1)呼叫基礎類的構建器。這個步驟會不斷重複下去,首先得到構建器的是分級結構的根部,然後是下乙個衍生類,等等。直到抵達最深一層的衍生類。

(2)按宣告順序呼叫成員初始化模組。

(3)呼叫衍生構建器的主體。

當我們在衍生類的時候,必須能假定基礎類的所有成員都是有效的。但在構建器內部,必須保證使用的所有成員都已構建。所以,首先呼叫基礎類的構建器,然後在進入衍生類構建以後,我們在基礎類能夠訪問的所有成員都已得到初始化。

15.構建器的職責是讓物件實際進入存在狀態。在任何構建器內部,整個物件可能只是得到部分組織——我們只知道基礎類物件已得到初始化,但不知道哪些類已經繼承。然而乙個動態繫結的方法呼叫卻會在分級結構裡"向前"或"向外"進行。

初始化的實際過程是這樣的:

(1)在採取任何其他操作之前,為物件分配的儲存空間初始化成二進位制0.

(2)呼叫基礎構建器。

python第七章 python教程(第七章)

字典和集合 字典是python中唯一,乙個對映型別 如何建立乙個字典,如下 dict dict 滲透 網路安全 怎麼理解字典呢?現實生活中的字典可以通過首字母進行查詢要查詢的漢子,python也可以這樣理解,通過 前的元素查詢到冒號後的元素。為什麼說字典是唯一乙個對映型別呢?看圖。對映型別區別與序列...

第七章 函式

1.ansi c 允許函式原型的使用,函式宣告提供給編譯器和之後的呼叫函式返回值型別,引數型別和數量的資訊,而k c用單獨的列表給出引數的型別,編譯器只記住函式的返回值型別,但不儲存函式的引數數量和型別 2.沒有return語句的函式,隱式的返回 3.函式的原型可以單獨放於乙個標頭檔案中,一定要具有...

第七章總結

7.2.2畫直線 畫直線使用cdc類的lineto 函式兩個過載版本 bool lineto int x,int y bool lineto point point 引數x y或point指定直線的終點位置,此函式從當前點到指定的終點之間畫一條直線,當前點包括在直線上,而終點不包括在直線上。如果畫線...