最近刷了些java的面試題目,發現繼承與多態這塊知識點面的多些,總結整理一下java
java面向對象的三大特性封裝繼承多態都是爲了提升代碼的複用率,使開發人員少寫代碼面試
繼承是指子類繼承父類的非私有成員變量與方法,在子類中能夠使用。函數
特徵:特徵有不少簡述一些this
1.Java是單繼承多實現。一個子類最多繼承一個父類,但能夠實現多個接口編碼
2.繼承具備傳遞性(多重或多極繼承)。若是C繼承了B,B又繼承了A,那麼C也就繼承了A的全部非私有成員變量與方法spa
3.基類派生出的子類具備可拓展性3d
每個類都有構造方法,若是不顯示寫的話,默認的是無參構造方法。爲養成良好的編碼習慣,咱們應該在父類中寫上無參構造方法 code
子類不能繼承父類的構造方法對象
首先找main函數入口,加載對應的類與static修飾的靜態代碼塊至JVM的方法區中去(順序父類至子類),接着去加載構造器(加載的同時會實例化對象,順序父類至子類)。blog
總之父類的構造器加載與初始化都優於子類
public class Cat extends Animal { static{ System.out.println("子類的靜態代碼塊加載了..."); } public Cat() { // 顯式調用super() super("小狗"); System.out.println("子類的無參構造方法執行了..."); } public Cat(String name) { // 隱式調用super() System.out.println("子類的有參構造方法執行了..."); } public static void main(String[] args) { //首先加載父類與其靜態代碼塊,在加載子類及其靜態代碼塊。接着去加載構造器順序由父類至子類 Animal cat = new Cat(); //同理可得 Animal cat2 = new Cat("小貓"); } } class Animal { private int num; private String name = "小豬"; public Animal(String name) { this.name = name; System.out.println("父類的有參構造方法執行了..." + this.name); } public Animal() { System.out.println("父類的無參構造方法執行了...."); } public static void say() { System.out.println("父類的靜態方法hello!"); } static { say(); System.out.println("父類的靜態代碼塊hi"); } }
PS:以上代碼爲本身原創,將上述代碼可以理清楚,相信對類的加載順序有必定的認知了,輸出結果以下:
首先多態有三要素:1.要有繼承關係 2.要有子類重寫父類成員方法 3.要有父類數據類型引用至子類
首先要清楚多態中的重寫是不可以重寫成員變量及satic修飾的成員變量或方法,它只能重寫方法(多態是運行時動態綁定的,static是在編譯時隨類一塊兒被靜態綁定的)
public class Cat extends Animal { static void say(){ System.out.println("hi!"); } public void speak(){ System.out.println("你好,我是小貓"); } protected String name = "小貓"; static int num = 20; public static void main(String[] args) { Animal cat = new Cat(); Cat cat2 = new Cat(); System.out.println(cat.name+":"+cat.num); System.out.println(cat2.name+":"+cat2.num); cat.say(); cat.speak(); } } class Animal { protected String name = "小狗"; static int num = 10; static void say(){ System.out.println("hello"); } public void speak(){ System.out.println("你好啊"); } }
輸出結果以下:
以上代碼參考自知乎,此外,知乎的那個花木蘭從軍解釋多態的例子講的不錯:https://www.zhihu.com/question/30082151
多態的弊端:不能使用子類特有的成員變量或方法,只能向下轉型
重寫(覆蓋,Overrding)是子類重寫父類的方法,相同的方法名,參數類型與返回類型
重載(OverLoad)發生在一個類中,方法名相同,參數列表不一樣,返回類型能夠不一樣,重載發生在編譯時
首先static修飾的部分會隨着類的加載而一塊兒被加載到JVM內存中的方法區中去。 若是某個成員變量或方法是被全部對象所共享的,那麼應該定義成靜態的
靜態成員只能訪問static修飾的成員變量或方法。非靜態成員能夠訪問靜態成員或方法。
static修飾的部分不能使用this,super關鍵字
static破壞了Java的多態性