生活随笔
收集整理的這篇文章主要介紹了
子类能否访问或覆盖父类的private方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
http://bettereveryday.iteye.com/blog/591771
private關鍵字的定義是“除了包含該成員的類之外 ,其他任何類都無法訪問這個成員.”,也就是說只有自己才能直接訪問到private成員,其他任何類,包括子類都無法訪問到這個成員。
?
我們可以來測試一下:
定義兩個類,Parent類和Child類
Parent類中有兩個方法,一個public方法,一個private方法
Child繼承自Parent類
Java代碼 ?
public ?class ?Parent?{ ?????? ?? ????public ?void ?publicMethod(){ ?? ????????System.out.println("hello?parent?public?method" ); ?? ????} ?? ????private ?void ?privateMethod(){ ?? ????????System.out.println("hello?parent?private?method" ); ?? ????} ?? } ?? ?? public ?class ?Child?extends ?Parent{ ?????? ?? ????public ?void ?publicMethod(){ ?? ????????System.out.println("hello?child?public?method" ); ?? ????} ?? ????private ?void ?privateMethod(){ ?? ????????System.out.println("hello?child?private?method" ); ?? ????} ?? ???? ?? ????public ?static ?void ?main(String?args[]){ ?? ????????Parent?child?=?new ?Child(); ?? ????????child.publicMethod(); ?? ?? ????} ?? }??
public class Parent {public void publicMethod(){System.out.println("hello parent public method");}private void privateMethod(){System.out.println("hello parent private method");}
}public class Child extends Parent{public void publicMethod(){System.out.println("hello child public method");}private void privateMethod(){System.out.println("hello child private method");}public static void main(String args[]){Parent child = new Child();child.publicMethod();
// child.privateMethod(); //若不注釋該行代碼,則會出現編譯錯誤:“The method privateMethod() from the type Parent is not visible”}
}
?從“// child.privateMethod();”行我們可以看出,父類的private方法是無法被子類覆蓋的,因為若能覆蓋,則會像覆蓋public方法一樣,不會出現任何編譯錯誤,而且從錯誤提示可以看出,“The method privateMethod() from the type Parent is not visible”,也就是“父類的privateMethod()方法(對子類而言)是不可見的”,即子類無法訪問父類的private方法。
這個可以從內存角度得到比較好的解釋:
我們可以將一個對象的內存分為兩部分,一部分繼承自父類對象,簡稱繼承內存,一部分是屬于自己的,簡稱自有內存,這就好像一個人的財產一樣,一部分是繼承自長輩,一部分靠自己打拼。
父類引用指向子類對象,那么該引用指向的其實只是繼承內存,它能調用的也就這點內存,這里面包括父類的成員變量,方法等等,父類引用指向的是一個子類對象,但它調用的是父類的privateMethod,但private方法是無法在其他對象中訪問到,所以就會產生編譯錯誤。
?
=============================================
http://blog.csdn.net/cdsnmdl/article/details/3968688
1、方法繼承: 利用extends關鍵字一個方法繼承另一個方法,而且只能直接繼承一個類。
當Sub類和Base類在同一個包時Sub類繼承Base類中的public/protected/默認級別的變量個方法 在不同包時繼承public/protected級別的變量和方法。
2、方法重載: 如果有兩個方法的方法名相同,但參數不一致,哪么可以說一個方法是另一個方法的重載。
方法名相同 方法的參數類型,個數順序至少有一項不同 方法的返回類型可以不相同 方法的修飾符可以不相同 main方法也可以被重載
3、方法覆蓋 :如果在子類中定義一個方法,其名稱、返回類型及參數簽名正好與父類中某個方法的名稱、返回類型及參數簽名相匹配,那么可以說,子類的方法覆蓋了父類的方法。
子類的方法名稱返回類型及參數簽名 必須與父類的一致 子類方法不能縮小父類方法的訪問權限 ?子類方法不能拋出比父類方法更多的異常 方法覆蓋只存在于子類和父類之間,同一個類中只能重載 父類的靜態方法不能被子類覆蓋為非靜態方法 子類可以定義于父類的靜態方法同名的靜態方法,以便在子類中隱藏父類的靜態方法(滿足覆蓋約束), ? ? ?? ? ? ? ? ?而且Java虛擬機把靜態方法和所屬的類綁定,而把實例方法和所屬的實例綁定。 父類的非靜態方法不能被子類覆蓋為靜態方法 父類的私有方法不能被子類覆蓋 父類的抽象方法可以被子類通過兩種途徑覆蓋(即實現和覆蓋)(P169) 父類的非抽象方法可以被覆蓋為抽象方法
4、Super關鍵字: super和this關鍵字都可以用來覆蓋Java語言的默認作用域,使被屏蔽的方法或變量變為可見(三種情況下的不可見P171)。
父類的成員變量和方法為private使用super訪問編譯出錯 在類的構造方法種,通過super語句調用這個類的父類的構造方法 在子類種訪問父類的被屏蔽的方法和屬性 只能在構造方法或實例方法內使用super關鍵字,而在靜態方法和靜態代碼塊內不能使用super
5、多態:
對于一個引用類型的變量,Java編譯器按照它的聲明的類型來處理 對于一個引用類型的變量,運行時Java虛擬機按照它的實際引用的對象來處理 運行時環境中,通過引用類型變量來訪問所引用對象的方法和屬性時,Java虛擬機采用以下綁定規則
1)實例方法與引用變量實際引用的對象的方法綁定,屬于動態綁定
2)靜態方法與引用變量所聲明的類型的方法綁定,屬于靜態綁定
3)成員變量(包括靜態和實例變量)與引用變量所聲明的類型的成員變量綁定,屬于靜態綁定?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?
6、繼承的利弊和使用原則:
(1)定義了下層子類都用友的相同屬性和方法,并且盡可能默認實現,從而提高重用性
(2)代表系統的接口,描述系統所能提供的服務
繼承關系最大的弱點:打破封裝 精心設計專門用于被繼承的類
(1)對這些類必須提供良好的文檔說明
(2)盡可能的封裝父類的實現細節,把代表時間細節的屬性和方法定義為private類型
(3)如果某些實現細節必須被子類訪問,定義為protected類型
(4)把不允許子類覆蓋的方法定義為final類型
(5)父類的構造方法不允許調用可被子類覆蓋的方法
(6)如果某些類不是專門為了繼承而設計,那么隨意繼承它是不安全的
?
總結
以上是生活随笔 為你收集整理的子类能否访问或覆盖父类的private方法 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。