1. 程式人生 > >Java中子類是否可以繼承父類的static變數和static方法,以及父類的private屬性和private方法

Java中子類是否可以繼承父類的static變數和static方法,以及父類的private屬性和private方法

轉載自以下原文:
原文連結1
原文連結2

一、子類可以繼承父類的private屬性和private方法:

1、子類繼承父類,子類擁有了父類的所有屬性和方法。
程式驗證,父類的私有屬性和方法子類是無法直接訪問的。當然私有屬性可以通過public修飾的getter和setter方法訪問到的,但是私有方法不行。

假設:子類不能夠繼承父類的私有屬性和方法

那麼:分析記憶體後,會發現,當一個子類被例項化的時候,預設會先呼叫父類的構造方法對父類進行初始化,即在記憶體中建立一個父類物件,然後再父類物件的外部放上子類獨有的屬性,兩者合起來成為一個子類的物件。

所以:子類繼承了父類的所有屬性和方法或子類擁有父類的所有屬性和方法是對的,只不過父類的私有屬性和方法,子類是無法直接訪到的。
即只是擁有,但是無法使用。

2、如果一個子類繼承了父類,那麼這個子類擁有父類所有的成員屬性和方法,即使是父類裡有private屬性的變數,子類也是繼承的,只不過不能使用,也就是說,它繼承了,但是沒有使用權,似乎又點矛盾,用我們通俗的說法就是 只能看,不能用,雖然是這樣,但是,我們還是可以通過set 和get的方法來間接的訪問父類中的private屬性的變數 。

二、子類不可以繼承父類的static變數和static方法:

1、無論是static修飾的變數,還是static修飾的方法,我們都知道他們是屬於類本身的,不是屬於某一個物件的,當宣告一個物件時,並不產生static變數和方法的拷貝。也就是說,用static修飾的變數和方法在類載入的時候,只分配一塊儲存空間,所有此類的物件都可以操控此塊儲存空間;

注:這裡要說明的是,當子類沒有與之同名的static變數(或方法時),子類的物件也可以操控這塊記憶體空間。但是子類並沒有繼承父類中static修飾的變數和方法。因為static修飾的變數和方法是屬於父類本身的

2、當存在繼承關係時,父類中有一個static修飾的變數(或方法),而子類中也存在一個同名的static修飾的變數(或方法)時,他們到底是否滿足“重寫”,而最終體現出多型的效果呢??

對於靜態方法在子類中是不存在“重寫”這一說的,就像前面我們提到的,用static關鍵字修飾的方法和變數都是屬於類自己本身的,即使存在繼承關係,子類並沒有繼承父類的static修飾的變數和方法,所以說即使子類和父類中都有同樣的static方法和變數,他們是沒有任何關係的,他們是相互獨立的,他們是屬於各自類本身的。因此也是不存在多型特性的。

而對於普通方法的呼叫是存在“重寫”而最終呈現出多型特性的。

同樣的道理:對於static修飾的變數,當子類與父類中存在相同的static變數時,也是根據“靜態引用”而不是根據“動態引用”來呼叫相應的變數的。

3、java中 子類會不會繼承父類的static變數和static方法?
先說static方法:子類會不會繼承父類的static方法呢??答案是:不會的,但是是可以訪問的。

接著來看父類的static修飾的變數,是否能夠被子類繼承呢??
答案:是不可以的。但是也是可以被子類訪問的。

小結:

1)類是不繼承父類的static變數和方法的。因為這是屬於類本身的。但是子類是可以訪問的。
2)類中同名的static變數和方法都是相互獨立的,並不存在任何的重寫的關係。的關係。

三、父類的構造方法不能被子類繼承