多型之父子爭權

2021-07-04 18:15:01 字數 1507 閱讀 4223

多型之父子爭權 --

模範青蛙

在談及這個問題之前,先說一下多型的三個前提條件: 1.

存在類的繼承 2.

存在方法的重寫 3.

父類引用指向子類物件

很多童鞋在多型這一塊兒存在一些疑慮:什麼時候呼叫父類的東西呢?什麼時候又是呼叫子類的東西呢?好迷茫。

針對這一問題,咱們來結合例子簡單分析一下:

看下面的乙個簡單的例子

public

class

test_02  }

class

father }

class

son 

extends

father }

下面就以上**進行分析:

首先來談論一下:物件「f」呼叫的是子類的方法?還是父類的方法?

大家都知道,子類繼承父類會繼承父類的一切非私有的方法和屬性,但是,當子類的方法與父類的方法重名時,父類的方法就會被覆蓋,所以:如果是物件呼叫方法,呼叫的是子類的方法,或許有人問:當呼叫的是子類沒有的方法呢?《那肯定是呼叫的從父類繼承過來的方法了》。

接下來討論一下:物件「f」呼叫的是子類的屬性?還是父類的屬性:

在討論之前,我們可以先做兩個小實驗:

實驗一:將父類中的name屬性加上私有的訪問許可權(private)這時你會發現在main()方法中「f.name」會報編譯時錯誤:意思就是沒有訪問許可權《如圖一:所示》

圖一:

實驗二:

將子類中的name屬性加上私有的訪問許可權(private)這時你會發現在main()方法中「f.name」沒有報錯誤:意思就是可以訪問《如圖二:所示》

圖二:

經過上面的兩個小實驗童鞋們應該知道這裡的「f」呼叫的是誰的name誰屬性了吧

下面來簡單總結一下為什麼出現以上情況:

如果子類裡存在與父類同名的方法,就意味著父類的那個方法已經被覆蓋掉了,系統就不可能把父類裡的方法搬到子類裡面去了。

但是,屬性卻不是這樣的,儘管子類裡定義了與父類相同的水屬性,父類的屬性依然不會被子類的屬性覆蓋。

所以繼承屬性和繼承方法之間存在著差異性,所以對於乙個引用型別的變數而言,當通過變數訪問它所引用的物件的屬性時,該屬性的值取決於宣告該變數時的型別。

當通過該變數呼叫它所引用的物件的方法時,該方法的行為取決於它所實際引用的物件的型別

最近一直有童鞋糾結這樣乙個問題:父類引用指向子類物件後,可以呼叫子類所特有的方法嗎?

答案是否定的,下面是個人的看法:父類引用指向子類物件後,會把父類的屬性和方法都載入到那個子類中去(當然如果子類存在和父類同名的方法,父類的方法就會被覆蓋了),而這個引用始終是指向從父類載入過來的那些屬性和(被子類重寫的和沒有重寫的方法),因此,這個引用是無法呼叫子類中所特有的方法的。



iframe之父子頁面通訊

iframe之父子頁面通訊 1 獲取 子頁面 的 window 物件 在父頁面中,存在如下兩個物件 window.frames document.iframeelement.contentwindow 可以獲取到 子頁面 window 物件 iframe id document.getelement...

linux之父子程序的輸出

首先,我們來回憶一下父程序與子程序,前幾節講了如何建立子程序,像這樣的,pid t id fork 這樣我們就建立好了乙個子程序,然而fork 函式的返回值是什麼呢?這裡要記住 子程序返回0,父程序返回子程序的pid,如果建立失敗的話就返回 1.由於是父程序建立的子程序,那麼子程序就繼承自父程序。比...

Vue之父子元件值傳遞

這裡用乙個 例項來解釋一下 子元件向父元件傳值 learn vuetitle src vue.js script window.onload function methods components methods template components methods template conten...