java核心技術1筆記 01

2021-08-15 22:23:41 字數 1128 閱讀 3010

如果是private,static方法,final方法或者構造器,那麼編譯器將可以準備知道應該呼叫哪個方法,我們將這種呼叫方式

稱為靜態繫結。與此對應的是,呼叫方法依賴於隱式引數的實際型別,並且在執行時動態繫結。

當程式執行時,並且採用動態繫結呼叫方法時,虛擬機器一定呼叫與x所引用物件的實際型別最合適的那個類的方法。假設

x的實際型別是d,它是c類的子類。如果d類定義了方法f(string),就直接呼叫它。否則,將在d類的超類中尋找f(string),以此類推。

每次呼叫方法都要進行搜尋,時間開銷相當大。因此,虛擬機器預先為每個類建立乙個方法表,其中類出了所有方法的簽名和

實際呼叫的方法。這樣依賴,在真正呼叫方法的時候,虛擬機器查詢這個表就行了。在前面的例子中,虛擬機器搜尋d類的方法表,

以便尋找與呼叫f(string) 相匹配的方法。這個方法既有可能是d.f(string),也有可能是x.f(string),這裡的x是d的超類。

如果呼叫super.f(param),編譯器將對隱式引數超類的方法進行搜尋。

由於getsalary 不是private方法、static 方法或final方法,所以將採用動態繫結。

在執行的時候,呼叫e.getsalary()的解析過程

1.首先,虛擬機器提取e的實際型別的方法表。既有可能是employee、manager的方法表,也有可能是employee類的其他子類的

方法表2.接下來,虛擬機器搜尋定義個體salary簽名的類。此時,虛擬機器已經知道應該呼叫哪個方法

3.最後,虛擬機器呼叫方法。

動態繫結有乙個重要非常重要的特性:無需對現存的**進行修改,就可以對程式進行擴充套件。假設增加乙個新類***,並且變數e有可能引用這個類的物件,我們不需要對包含呼叫e.getsalary()的**進行重新編譯。如果恰好e引用乙個***類物件,就會自動呼叫***.getsalary()方法

final修飾的類不可以被繼承,域也可以被宣告為final。對於final域來說,構造物件之後就不允許改變它們的值了。不過如果將乙個類修飾final,只有方法為final型別,域不是

抽象類person 有個抽象方法

person p=new student()  可以,p.get***由於不能構造person類的物件,所以變數p永遠不會引用到person物件,而是引用子類student 物件

《C 語言核心技術》p46 筆記

c語言沒有嚴格地禁止修改字串字面值,但不應該這麼做 char p house 初始化乙個字元指標 char p m 上面的語句具有不可移植性,原因之一是,編譯器將字串字面值視為常量,可能會將字串儲存在唯讀儲存器,所以試圖對此字串執行寫入操作將會產生錯誤。另乙個原因是,如果程式中有兩個或更多個完全相同...

Java核心技術 筆記6 7

1 repeat 10 0 system.out.println hello world 要接受此lambda表示式,需要提供函式式介面 public static void repeat int n runnable action action.run 會執行lambda表示式主體 2.不止乙個函...

Java核心技術 筆記6 8

1.區域性內部類中,若只建立乙個類的物件 只用了一次 就不用命名了,即 匿名內部類 public void start int interval,boolean beep timer t new timer interval listener t.start 0 形式即 new supertype ...