1. 程式人生 > >JAVA核心技術I---JAVA基礎知識(多型)

JAVA核心技術I---JAVA基礎知識(多型)

一:類轉型

類轉型:子類可以轉父類,父類不可以轉子類(除非父類物件本身就是子類)

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 void
plough() { 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.呼叫方式一樣,結果一樣