前面我簡單的說了下繼承的基本用法..現在我在補充一點繼承中很容易忽視的東西,比如說super
如圖,我在父類(Father)中的構造函數中加了一句輸出語句,而在子類中我什麼都沒做..但是在new子類對象的時候,卻將父類構造函數裡面的內容輸出了...怎麼回事兒呢??
是不是感到很困惑..我可能用了假的編譯器....手動滑稽
好了...我揭開謎底了..因為在構造函數中..都有一個隱式的super()...
這兩個類的意思是一樣的...
好了,我解釋下super這個方法
super的中文解釋就是'超' 具體含義呢,就是說調用父類的方法.比如我們之前講過的this,this是調用(指代)對象本身的方法及其屬性,super就是調用這個對象的父類方法和屬性.
這裡的super(),就是在調用父類的空參數類型的構造方法,所以我們在new子類的時候.遇到子類的構造方法,然後又碰到了super(),所以就將父類空參數構造方法裡面的內容給執行了一道.
在這裡,提醒一次..在子類構造函數中,默認會有一個super(),它的意思就是調用父類的空參數構造方法..但是..如果你定義過父類的構造方法呢...
發現沒..直接就報錯了..在java中,每個類都默認有個空參數的構造器,比如Father(){},但是當你自己定義了構造器之後(Father(String args){}),原來默認的構造器就不見啦..如果需要的話,就只能夠自己定義了.
而每個子類的構造器中都有一個默認的super方法.這個默認的super()方法,本來是要去訪問父類的空參構造方法的.結果你把父類的空參數構造器整不見了..對此.默認的super()方法..表示.它也很絕望啊..然後就提出了抗議(報錯了).
那麼該怎麼解決呢..這裡有兩個解決方案:
1:自己在多定義一個空參數構造方法..如圖
這是一種方法..很容易理解對吧..直接多定義一個就OK了...
2:手動定義super語句...如圖
看到了吧..就將默認的super()給替換成了super(String) .眼尖一點的一下就看出來了..super調用父類的構造器時候就是通過參數來識別到底要調用那個構造方法的..畫個圖,我就不多說了
就醬紫啦...關於super調用構造方法我就說到這裡了....
接下來我們談談super的另外一個使用方式..調用父類的屬性和方法
OK..這是沒用super...因為子類把父類的show方法復寫了.所以直接就將子類函數中的東西打印出來了...我們在用一下super看看
看..我們在子類show方法中使用super.show(),直接調用父類的show方法..所以就將父類的show方法打印出來了...怎麼 好玩不.
當然..super調用方法..我講了..那麼用super調用父類的屬性..是不是也是一樣的......嘿嘿..我就偷懶了
有什麼錯誤歡迎各位大佬提出......有什麼問題請在評論區問....