繼承extends,不支持多繼承,但支持多層繼承java
如何使用一個繼承體系中的功能呢?面試
想要使用體系,先查閱體系父類的描述,由於父類中定義的是該體系中共×××。數組
經過了解共×××,就能夠知道該體系的基本功能。ide
那麼這個體系已經能夠基本使用了。函數
那麼在具體調用時,要建立最子類的對象,爲何呢?this
一是由於有可能父類不能建立對象,spa
二是建立子類對象可使用更多的功能,包括基本的也包括特有的。orm
簡單一句話:查閱父類功能,建立子類對象使用功能。對象
---------------------------------------------------繼承
1.多態的體現:
向上轉型:父類的引用指向了本身的子類對象,這樣的話,父類引用就變成父類成員,使用的方法是子父類的交集,也就是子類繼承父類後重寫的方法
向下轉型:強制將父類的引用,轉成子類對象。記住不能將父類轉成子類,由於父類自己不具有子類有的內容
abstract class Animal{ abstract void eat();} class Cat extends Animal{ public void eat(){ System.out.println("吃魚"); } public void catchMouse(){ System.out.println("抓老鼠"); } } class Dog extends Animal{ public void eat(){ System.out.println("吃骨頭"); } publci void kanJia(){ System.out.pritnln("吃骨頭"); } } public static void function(Animal a) //Animal a=new Cat(); { a.eat; if(a instanceof Cat){ Cat c=(Cat)a; c.catchMouse(); }else if(a instanceof Dog){ Dog c=(Dog)a; c.kanJia(); } } main(){ function(cat); function(dog); }
--
向上轉型
Animal a=new Cat();
a.eat
向下轉型
Cat c =(Cat)a
if (a instanceof Type) 判斷對象是不是繼承或者等於某個Type類
if (this.getClass()==obj.getClass)判斷對象的類型是否和某個類相同
-----------------------
面試題,通常開發不會出現
小技巧:
在多態總花姑娘成員函數的特色:
在編譯時期:查閱 引用型所屬的類中 是否有調用的方法。若是有,編譯經過,若是沒有,就編譯失敗
在運行時期:查閱對象所屬類中是否有調用的方法
簡單方法總結就是:成員函數在多態調用時,編譯看左邊,運行看右邊
Animal a=new Cat();
a.eat
a.catchMouse
左邊: Animal是否有catchMouse方法,若是沒有,就已是編譯不經過了
右邊:Cat是否有catchMouse eat方法,若是有,那麼就用Cat方法,若是沒有就會用父類方法,那麼就會運行失敗(由於父類通常是抽象類)
在多態中,成員變量的特色:
不管編譯和運行,都參考左邊(引用型變量所屬的類)
靜態成員的話,是不用參考右邊的,由於不須要對象,因此,左邊哪一個類調用靜態成員或者方法,就是該類的靜態成員或者方法,就是該類的靜態所屬
---
賦值的多態
Quadrangle obj=new Square();聲明的變量obj是Quadrangle類型的,而賦值倒是Square類型的實際變量
Quadrangle obj1=new Parallelogram();
Suqare newObj=(Square)quaObj; 強制類型轉換
多態數組--將父類數組元素進行子類的對象賦值
Quadrangle[] quadrangles=new Quadrangle[3]; quadrangles[0]=new Square(); quadrangles[1]=new Parallelogram(); for (Quadrangle obj:quadrangles){ obj.draw(); }
返回類型的多態--經過定義父類類型的方法,返回父類型的初始值
public Quadrangle getQuadrangle(){ Quadrangle tmp=new Quadrangle(); return tmp; }
方法的多態--將父類方法用於的參數定義爲父類成員,那麼調用此方法的子類成員都也能夠調用父類方法
public void alldraw(Quadrangle quadrangle){ quadrangle.draw; } Quadrangle.alldraw(square); Quadrangle.alldraw(parallelogram);
將父類Quadrangle 進行繼承給 Suqare和Parallelogram。
而後利用Quadrangle類格式變成數組格式,而後將子類對象的實參 賦值給父類的對象,在用foreach進行輸出每一個元素的draw()方法。
---------------------------------------------------------------------------------
public class Quadrangle{ public void draw(){ System.out.println("繪製自身圖形"); } }
--------------------------
public class Square extends Quadrangle { public void draw(){ System.out.println("正方形"); } }
----------------------------
public class Parallelogram extends Quadrangle { public void draw(){ System.out.println("長方形"); } }
-------------------------------
public class Demo{ public static void main(String[] args){ Quadrangle[] quadrangles=new Quadrangle[3]; quadrangles[0]=new Square(); quadrangles[1]=new Square(); quadrangles[2]=new Square(); for (Quadrangle obj:quadrangles){ obj.draw(); } } }