瞭解多型

Dragon.liu發表於2020-12-20

類的多型

需求:有四個類,Student、Worker、Teacher、Doctor要求在一個類中定義方法來將以上類作為方法的引數接受。現在能想到可以使用方法的過載接受。如下:

package com.CoderLB;

import java.io.Serializable;
import java.sql.SQLOutput;

public  class Student  {

    public void say() {
        System.out.println("我是一個學生");

    }
}



package com.CoderLB;

public class Teacher {
    public void say(){
        System.out.println("我是一個老師");
    }
}

package com.CoderLB;

import java.io.Serializable;


public class Worker{
    public void say() {
        System.out.println("我是一個工人");
    }

}

package com.CoderLB;

public class Doctor {
    public void say(){
        System.out.println("我是一個醫生");
    }
}

package com.CoderLB;

public class Apply {
    public void getInfo(Student s){
        s.say();
    }
    public void getInfo(Teacher t){
        t.say();
    }
    public void getInfo(Worker w){
        w.say();
    }
    public void getInfo(Doctor d){
        d.say();
    }
}

package com.CoderLB;

import java.util.Scanner;

public class Hi {

    public static void main(String[] args) {
        Apply app=new Apply();
        app.getInfo(new Student());
        app.getInfo(new Teacher());
        app.getInfo(new Worker());
        app.getInfo(new Doctor());

    }
}

上述使用過載方法實現了需求,但是存在有弊端,假如型別很多,那麼在Apply中過載的方法也需要很多。這樣程式碼的應變性不高,耦合度不高,依賴性強。此時就可以多型的特徵解決(向上轉型),可以將接受引數的方法的引數型別定義為所有類的父類。

package com.CoderLB;

/**
 * 定義一個抽象類
 */
public  abstract class Person {
    public abstract void say();
}

package com.CoderLB;

import java.io.Serializable;
import java.sql.SQLOutput;

public  class Student extends Person {

    public void say() {
        System.out.println("我是一個學生");

    }
}



package com.CoderLB;

import java.io.Serializable;


public class Worker extends Person{
    public void say() {
        System.out.println("我是一個工人");
    }

}

package com.CoderLB;

public class Doctor extends Person {
    public void say(){
        System.out.println("我是一個醫生");
    }
}

package com.CoderLB;

public class Teacher extends Person {
    public void say(){
        System.out.println("我是一個老師");
    }
}

package com.CoderLB;

public class Apply {
    public void getInfo(Person per){
        per.say();
    }

}

package com.CoderLB;

import java.util.Scanner;

public class Hi {

    public static void main(String[] args) {
        Apply app=new Apply();
        app.getInfo(new Teacher());//Person per = new Teacher() 向上轉型
        app.getInfo(new Worker());
        app.getInfo(new Student());
        app.getInfo(new Doctor());


    }
}
//輸出
我是一個老師
我是一個工人
我是一個學生
我是一個醫生

Apply類中的getInfo方法就不需要過載了,這就是多型的好處的直接體現。使用了多型實現了方法引數的統一。

相關文章