1. 程式人生 > >JAVA-初步認識-第八章-繼承-子父類中成員函數特點-覆蓋

JAVA-初步認識-第八章-繼承-子父類中成員函數特點-覆蓋

ont 什麽是 構造 調用方法 是我 尋找 都是 第八章 根據

一.

講述完成員變量,開始討論一下成員函數在子父類中的特點。(還要復習不同函數的區別,以及為什麽會有這樣的區別?)

技術分享

子類繼承父類,而且不是私有的,都可以直接拿過來用。

技術分享

對程序在內存中的運算過程,進行一個講解。

先是主函數main和引用變量z加載入棧中,接著創建Zi類的對象,由於Zi類繼承了Fu類,因此父類先加載。類是加載入方法區的,先是加載構造函數,然後加載show1()方法。然後加載Zi類,也是加載入構造函數Zi(),一般函數show2(),由於是有繼承關系,存在一個super關鍵字,指向父類。

技術分享

緊接著,堆內存中new一個Zi類對象,對象建立完之後,將地址編號賦值給引用變量z,完成z指向對象。

技術分享

往下就是執行z.show1()和z.show2(),對象調用方法。由於對象是根據Zi類創建的,那麽z.show1()在執行時,就是在子類中尋找有沒有show1()方法,肯定是先找自己。一找,沒有,接下來,就跟著super到父類中尋找,找到show1(),show1()就進棧,接著運行了。到第三句,對象調用show2()方法,去子類中找到了該方法,進棧運行就結束了。→這裏還想插一句,關於子類內容和父類內容之間相互包含的問題。這個問題要從兩個角度來分析,從代碼上來看,符合繼承關系的兩個類之間,內容是完全不同的(從繼承的定義來看,父類是從子類中抽取出來的,抽取之後,子類中就不存在該部分的內容,這部分內容單獨成了一個類)。從背後的含義來看,雖然兩個類的內容完全不同,但是子類是包含著父類的。

上面是對一般情況的描述,我們要著重講解地是特殊情況。也就是兩個類中有重名的方法。按照我們以前的知識來看,一個類中不可能存在相同聲明的兩個類,會存在調用不確定的問題。但是在子父類中可以存在相同聲明的兩個函數,為什麽,因為它們有所屬(雖然聲明是一樣的,但是存儲的位置是不同的,那麽這兩個函數也就是不同的)。

按下圖所示,如果執行語句中,調用的是show()方法,由於子類中自己有show(),那麽直接調用就可以了,不需要再去父類中尋找了。

技術分享

技術分享

(這兩個特性只有函數具有,重載的定義又忘記了。)

只有子類才能覆蓋父類,

覆蓋的意思是,就好像父類的方法被覆蓋掉一樣,其實沒有覆蓋,看著像。

這裏還要插一句,應該來說不是每次創建對象都是采用的子類來作為對象的描述類的。還是說,由於是固定的繼承關系,根據前期的分析整理,就保證了子類是包含有最大範圍的內容,那麽每次創建對象都是用子類來進行。

覆蓋操作的註意事項

必須要體現出子類和父類是一模一樣,(這裏的一樣是指函數一樣),函數一樣是說返回值類型,函數名和參數列表,就是函數聲明一致。(而重載是區分括號裏的東西)

技術分享

截圖是什麽意思呢?

目前我們學了三種權限,public,private,以及什麽都沒寫的默認權限(前面什麽權限修飾符都不寫,本身也是一種權限)。當我們覆蓋的時候,如果權限一致是可以的。如果父類裏面加上了public,而子類中什麽都沒有,那麽子類的權限就低於父類,這不合適(默認權限的大小是怎樣的?),不能這樣蓋。DOS結果顯示如下,就是說子類的權限太低了。這就是所說的覆蓋權限不夠,

技術分享

技術分享

如果子父類的權限都為public,這就是相等。如果父類中的函數為默認權限,子類為public權限,編譯是沒有問題的。

如果父類中是private權限,子類中是public權限。這個不叫覆蓋,為什麽呢?覆蓋有這麽一個特點,就是說父類有一個我可以用,但是我建立自己的,所以編譯一個一模一樣的,把你蓋上,用我自己的,但是這裏父類中的這個根本用不了。私有了,外面不知道,子類根本不知道父類有,不知道何談覆蓋呢。

技術分享

覆蓋是什麽意思呢?子類不用的情況下,父類可以用。

當權限相同時,如果父類中又用static修飾,是怎麽樣呢?一編譯,出錯了。

技術分享

技術分享

緊接著又換了一種書寫形式,子類為static修飾,父類沒有,DOS結果顯示,也是出錯。上下兩種情況不一樣,一個是“被覆蓋的方法”,另一個是“覆蓋的方法”。

技術分享

技術分享

如果兩邊都加靜態,就沒問題了。DOS顯示編譯是可行的。

技術分享

技術分享

因此,註意事項如下。第二種很少見,到多態的時候,給大家講解,為什麽是這麽一回事。對靜態的方法而言,我們說的覆蓋吧,並不是特別確切,因為它不再是依賴對象了,它依賴的是類。哪個類去用哪個內容。

技術分享

JAVA-初步認識-第八章-繼承-子父類中成員函數特點-覆蓋