JAVA核心技術I---JAVA基礎知識(多型)
阿新 • • 發佈:2018-12-28
一:類轉型
類轉型:子類可以轉父類,父類不可以轉子類(除非父類物件本身就是子類)
1.父類
public class Human { public void say() { System.out.println("Hello World"); } public void eat() { System.out.println("eat food"); } }
2.子類
public class Men extends Human{ public voidplough() { System.out.println("Men is ploughing"); } public void eat() { System.out.println("Men is eating"); } }
3.實現轉型
public class HumanTest { public static void main(String args[]) { Men m=new Men(); m.eat(); //子類轉父類 Human hm=m; hm.eat(); hm.say(); //hm.plough();//The method plough() is undefined for the type Human //父類轉子類(前提該父類是子類轉過去的) Men m2=(Men)hm; m2.eat(); m2.plough(); } }
Men is eating Men is eating Hello World Men is eating Men is ploughing
4.問題:編譯時報錯和執行時報錯
class Pencil { public void write (String content){ System.out.println( "Write",+content); } } class RubberPencil extends Pencil{ public void write (String content){ System.out.println("Rubber Write"+content); } public void erase (String content){ System.out.println( "Erase "+content); } } 執行下列程式碼的結果是哪項? Pencil p=new Pencil(); (( RubberPencil) p).write("Hello");
C.執行時丟擲異常
D.編譯失敗
強制轉換是允許的,不過相當於會產生記憶體越界,導致執行時報錯
二:多型
多型:子類轉型為父類後,呼叫普通方法,依舊是子類的
1.父類
public class Human { public void say() { System.out.println("Hello World"); } public void eat() { System.out.println("eat food"); } }
2.子類:對父類方法重寫
public class Women extends Human{ public void weave() { System.out.println("women is weaving"); } public void say() { System.out.println("Hello World,I am a women"); } public void eat() { System.out.println("Women eat food"); } }
public class Men extends Human{ public void plough() { System.out.println("Men is ploughing"); } public void eat() { System.out.println("Men is eating"); } public void say() { System.out.println("Hello World,I am a man"); } }
public class Child extends Human{ public void eat() { System.out.println("Child is eating"); } public void say() { System.out.println("Hello World,I am a Child"); } }
3.多型實現
public class HumanTest { public static void main(String args[]) { Human[] HM= new Human[3]; HM[0]=new Men(); HM[1]=new Women(); HM[2]=new Child(); for(int i=0;i<3;i++) { HM[i].eat(); HM[i].say(); } } }
Men is eating Hello World,I am a man Women eat food Hello World,I am a women Child is eating Hello World,I am a Child
三:利用多型實現解耦
(一)父類實現解耦
public class HumanTest { public static void main(String args[]) { HumanSay(new Men()); HumanSay(new Women()); HumanSay(new Child()); HumanSay(new Child() { public void say() { System.out.println("Someone is eating"); } }); } public static void HumanSay(Human a) { //方法不是依賴某個具體子類,可以使用父類,抽象類,甚至介面來實現解耦 a.say(); } public static void HumanEat(Human a) { a.eat(); } }
Hello World,I am a man Hello World,I am a women Hello World,I am a Child Someone is eating
(二)介面實現:
1.介面
public interface Human { public void say(); public void eat(); }
2.子類
public class Men implements Human{ public void plough() { System.out.println("Men is ploughing"); } public void eat() { System.out.println("Men is eating"); } public void say() { System.out.println("Hello World,I am a man"); } }
public class Women implements Human{ public class Child implements Human{
3.其他一樣,結果相同
(三)抽象類實現
1.抽象類
public abstract class Human { public abstract void say(); public void eat() { System.out.println("Human is eating"); } }
2.子類
public class Men extends Human{ public class Women extends Human{ public class Child extends Human{
3.呼叫方式一樣,結果一樣