多態(tài)
何為多態(tài)秤掌?
?????通俗的講是引用的多種形態(tài)愁铺,往往是由引用實際指向的對象決定。方法有多態(tài)闻鉴,屬性沒有多態(tài)茵乱。
靜態(tài)(編譯期間)多態(tài) :方法的重載,嚴格來說不算是多態(tài)的體現(xiàn)孟岛,只是增加了程序的靈活性瓶竭。
動態(tài)(運行期間)多態(tài) :重寫和向上轉(zhuǎn)型
多態(tài)的三要素?
- 存在某種聯(lián)系(繼承類或者實現(xiàn)接口)
- 方法的重寫
- 父引用指向子類對象
多態(tài)的體現(xiàn)渠羞?
向上轉(zhuǎn)型
?????子類重寫父類方法斤贰,父類引用執(zhí)行子類重寫的方法;
?????父類獨有的方法次询,父類引用執(zhí)行父類獨有方法荧恍;
?????子類獨有方法,則不允許執(zhí)行屯吊,否則需要強行向下轉(zhuǎn)型块饺,調(diào)用子類獨有方法。
package hchang.demo.java.base.varscope;
/**
* 父類
*/
public class Parent {
public void eat(){
System.out.println("parent eat");
}
protected void cost(){
System.out.println("parent cost moneny");
}
}
package hchang.demo.java.base.varscope;
/**
* java 多態(tài)
* 1雌芽、重寫與重載
* 2、向上轉(zhuǎn)型 父類的引用執(zhí)行子類的對象
*/
public class Son extends Parent{
@Override
public void eat() {
System.out.println("son eat");
}
public void paly() {
System.out.println("son paly");
}
public static void main(String[] args) {
//向上轉(zhuǎn)型 父類引用執(zhí)行子類重寫的方法辨嗽,子類沒有重寫父類則不允許執(zhí)行
Parent parent = new Son();
parent.eat();
parent.cost();
//向下轉(zhuǎn)型
((Son) parent).paly();
}
}
運行結(jié)果
son eat
parent cost moneny
son paly
方法重載和方法重載區(qū)別:
區(qū)別 | 重寫 | 重載 |
---|---|---|
方法列表 | 必須一樣 | 必須不一樣 |
返回類型 | 必須一樣 | 可以不一樣 |
訪問修飾符 | 一定不能做更嚴格的限制(可以降低限制) | 可以不一樣 |
方法重寫
?????被重寫的方法必須有@Overvide注解修飾世落,父類的final、static糟需、private 修飾的方法不允許被重寫屉佳,返回值類型(JDK7以后,被重寫的方法返回值類型可以不同洲押,但是必須是具有父子關(guān)系的)和形參都不能改變武花。即外殼不變,核心重寫杈帐。
方法重載
/**
* 1体箕、重載的方法參數(shù)列表必須不一樣
* 2专钉、返回值類型可以一樣可以不一樣
* 3、修飾符可以不一樣
*/
public class OverloadDemo {
public void eat(String name,String age,String sex){
}
private String eat(String name,String age,Integer s){
return null;
}
}