咱們都知道Java中的繼承是複用代碼、擴展子類的一種方式,繼承使得Java中重複的代碼可以被提取出來供子類共用,對於Java程序的性能以及修改和擴展有很大的意義,因此這是一個很是重要的知識點。性能
那麼對於繼承的知識點,你真的都瞭解了嗎?對象
首先,咱們都知道子類繼承父類,就能直接訪問父類的公共屬性以及受保護屬性(public和protected),同時也能直接訪問父類的公共方法以及受保護方法;其次,對於父類的私有屬性,子類並不能直接訪問,可是能夠經過父類提供的getter和setter方法進行訪問,而父類的私有方法,子類沒法直接訪問;還有,對於父類的包訪問權限屬性和方法(default),若是子類和父類在同一個包下,子類能夠繼承而且直接訪問到,若是兩者不在同一個包下,則子類沒法直接訪問到這些方法和屬性,可是一樣的能夠經過父類的getter和setter方法去訪問這些屬性;最後一點,咱們不少人其實都有疑問,子類繼承父類,不是應該繼承了父類的全部東西嗎,爲何訪問不到那些私有屬性?其實這裏要從內存分析來看,當咱們要建立一個子類的對象時,Java虛擬機會先幫咱們生成對應的父類對象,由於咱們都知道,在子類的構造方法中中,首行代碼必須是父類構造方法的調用,即經過super關鍵字來調用,若是不寫,則虛擬機會自動幫咱們加入super()(前提是父類有無參構造方法),若是父類沒有無參構造方法而有有參構造方法,那麼子類的構造方法必須顯性的調用父類的構造方法,不然會報錯。經過這一點咱們就知道在建立子類對象的時候,Java虛擬機是先建立父類的對象,而後在這個父類對象的基礎上加上子類特有的方法和屬性,從而建立出子類對象,所以從這裏咱們能夠得知,子類是擁有父類的全部屬性和方法的,可是擁有不表明可以訪問!!!父類私有的方法和對象是子類沒法直接訪問的,子類僅僅是擁有但訪問不到!繼承
這裏補充一下特殊的狀況,就是父類中的final屬性和方法以及static屬性和方法子類是可以繼承並直接訪問的,可是final的屬性子類沒法修改,final的方法子類沒法重寫,說明final修飾的方法並不具有動態綁定;而static的屬性和方法會存在隱藏現象,即當子類中出現與父類static變量或者方法同名的變量或者方法時,子類的成員變量和靜態方法會被隱藏,如:父類中有public static int nun = 1,而子類中有public static int num = 2,這時候用向上轉型的對象(好比Father father = new Son(),其中Father是父類,Son是子類)去輸出num屬性會發現輸出爲1!static方法的隱藏理論同屬性一致。若是你想調用子類的static方法和屬性,你須要定義明確子類(如Son son = new Son())的對象去調用,從這裏看出static方法和屬性也不支持動態綁定!因此子類並不能重寫父類的static方法。內存
以上是我我的對Java繼承一些看法,若是有補充或者修改的地方請在評論區指出來,謝謝!get
知識點擴展:Java中的動態綁定,是實現多態的本質,它只針對普通方法,並且僅僅是方法,不包括成員變量那些!因此說若是你用一個向上轉型的父類對象去調用父類對象中的非final、非static屬性,即便它對應的子類中有同樣的屬性,最終輸出仍是父類對象的屬性!最後補充一點,Java中除了final、static、private修飾的方法以及構造器(構造器默認爲static)爲靜態綁定以外,其餘方法皆爲動態綁定。虛擬機