多型之父子爭權 --
模範青蛙
在談及這個問題之前,先說一下多型的三個前提條件: 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...