黑馬程序員__多態技巧總結

------Java培訓期待與您交流! -------

繼承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();
}
}
}
相關文章
相關標籤/搜索