1. 程式人生 > 實用技巧 >JavaSE之多型

JavaSE之多型

多型

  1. 繼承的多型問題:一個父類中的方法可有一個或多個子類繼承或重寫,所以我們在呼叫方法時不知道自己呼叫的是哪個子類的方法,只有當執行時才會知道。基於繼承的實現機制主要表現在父類和繼承該父類的一個或多個子類對某些方法的重寫,多個子類對同一方法的重寫可以表現出不同的行為。不同的物件可以執行相同的行為,但是他們都需要通過自己的實現方式來執行,這就要得益於向上轉型了。
public class Wine {
    private String name;
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Wine(){
    }
    
    public String drink(){
        return "喝的是 " + getName();
    }
    
    /**
     * 重寫toString()
     */
    public String toString(){
        return null;
    }
}

public class JNC extends Wine{
    public JNC(){
        setName("JNC");
    }
    
    /**
     * 重寫父類方法,實現多型
     */
    public String drink(){
        return "喝的是 " + getName();
    }
    
    /**
     * 重寫toString()
     */
    public String toString(){
        return "Wine : " + getName();
    }
}

public class JGJ extends Wine{
    public JGJ(){
        setName("JGJ");
    }
    
    /**
     * 重寫父類方法,實現多型
     */
    public String drink(){
        return "喝的是 " + getName();
    }
    
    /**
     * 重寫toString()
     */
    public String toString(){
        return "Wine : " + getName();
    }
}

public class Test {
    public static void main(String[] args) {
        //定義父類陣列
        Wine[] wines = new Wine[2];
        //定義兩個子類
        JNC jnc = new JNC();
        JGJ jgj = new JGJ();
        
        //父類引用子類物件,向上轉型呼叫父類的成員方法
        wines[0] = jnc;
        wines[1] = jgj;
        
        for(int i = 0 ; i < 2 ; i++){
            System.out.println(wines[i].toString() + "--" + wines[i].drink());
        }
        System.out.println("-------------------------------");

    }
}
OUTPUT:
Wine : JNC--喝的是 JNC
Wine : JGJ--喝的是 JGJ
  1. 介面的多型問題:既然繼承可以通過父類同一方法的不同子類來實現具體呼叫,那麼我們同樣也可以通過實現介面並重寫介面內的同一方法的不同的類進行呼叫。
public class TestInterface {
	public static void main(String[] args) {
		Flyable b = new Bird();
		b.fly();
		
		Flyable k = new Kite();
		k.fly();
	}
}
interface Flyable{
    //抽象方法
	void fly();
}
class Bird implements Flyable{

	@Override
	public void fly() {
		System.out.println("展翅高飛");
	}
	
}
class Kite implements Flyable{

	@Override
	public void fly() {
		System.out.println("別拽我,我要飛");
	}
	
}

參考:https://www.cnblogs.com/chenssy/p/3372798.html
參考:https://blog.csdn.net/weixin_41043145/article/details/95870010