多態
多態是指某一引用可以指向多種形態的對象,調用同一個方法可以執行多種形態的結果;代碼層面就是父類的引用可以指向不同子類的對象實例:
package characteristic.polymorphism;
/**
* 聲明Person類
*
* @author 學霸聯盟 - 趙燦
*/
public class Person {
private String name = "人";
//創建一個睡覺的方法
public void sleep(){
/*
* 封裝的又一大好處,如果不將屬性name封裝成getName方法
* 這裏就無法通過重寫getName方法獲得子類對象的姓名
* 當傳入的對象時LiuBei時,調用的getName時LiuBei中重寫後的
*/
System.out.println(getName() + ":閉着眼睛睡覺");
}
//獲取姓名的方法
public String getName(){
return name;
}
}
package characteristic.polymorphism;
/**
* 創建劉備:用於測試繼承的情況
* @author 學霸聯盟 - 趙燦
*/
public class LiuBei extends Person {
private String name = "劉備";
//獲取姓名的方法
public String getName(){
return name;
}
}
package characteristic.polymorphism;
/**
* 創建關羽:用於測試重寫的情況
* @author 學霸聯盟 - 趙燦
*/
public class GuanYu extends Person {
private String name = "關羽";
//重寫父類的方法
@Override
public void sleep() {
System.out.println(getName() + ":睜着一隻眼睛睡覺");
}
//獲取姓名的方法
public String getName(){
return name;
}
}
package characteristic.polymorphism;
/**
* 創建張飛:用於測試重寫的情況
* @author 學霸聯盟 - 趙燦
*/
public class ZhangFei extends Person {
private String name = "張飛";
//重寫父類的方法
public void sleep() {
System.out.println(getName() + ":睜着兩隻眼睛睡覺");
}
//獲取姓名的方法
public String getName(){
return name;
}
}
package characteristic.polymorphism;
/**
* 測試多態
*
* @author 學霸聯盟 - 趙燦
*/
public class Test {
// 創建main方法
public static void main(String[] args) {
//創建一個劉備
LiuBei liuBei = new LiuBei();
//創建一個關羽
GuanYu guanyu = new GuanYu();
//創建一個人,這個人是張飛,父類引用指向子類對象
Person zhangfei = new ZhangFei();
//執行時會將liuBei中存儲的地址,賦值給參數p
testSleep(liuBei);
//執行時會將guanyu中存儲的地址,賦值給參數p
testSleep(guanyu);
//執行時會將zhangfei中存儲的地址,賦值給參數p
testSleep(zhangfei);
}
/**
* 測試人類是怎樣睡覺的
* 首先需要人,這個人是誰都可以
* 如果選用LiuBei作爲參數,其他人就無法傳入這個方法
* 選用其他人也存在一樣的問題
* 所以這裏選用Person作爲參數,只要繼承人類的類都可以
*/
private static void testSleep(Person p) {
//調用人類睡覺的方法,傳入不同的子類,執行後獲得不同的結果
p.sleep();
}
}
運行結果:
劉備:閉着眼睛睡覺
關羽:睜着一隻眼睛睡覺
張飛:睜着兩隻眼睛睡覺
一句話總結:父類引用指向子類對象時,該引用可以調用自身訪問修飾符允許訪問的成員和子類重寫後的方法關鍵字final
放在變量前,表示該變量爲常量,只能被賦值一次;放在方法前,表示該方法不能被重寫
放在類前,表示該類不能被繼承
實例一:
package characteristic.inherit._final;
/**
* final修飾的類不能被繼承
* @author 學霸聯盟 - 趙燦
*/
public final class FinalDemo {
//final修飾的屬性,聲明和賦值必須寫成一條語句
public final String s = "常量值";
//final修飾的方法不能被重寫
public final void m(){
//final修飾的局部變量,聲明和賦值可以分成兩條語句
final String s;
s = "";
}
//final修飾的方法可以被重載
public final void m(final String s){
//final修飾的參數s,在方法中不能被修改
s = "";//這裏會出現編譯錯誤
}
}
實例二:
package characteristic.inherit._final;
/**
* 測試static方法是否可以被重載
* @author 學霸聯盟 - 趙燦
*/
public class Bird {
//靜態的不可被重寫的飛行方法
public static final void fly(){}
//靜態的攻擊方法
public static void fire(){}
}
package characteristic.inherit._final;
/**
* 測試static方法是否可以被重載
* @author 學霸聯盟 - 趙燦
*/
public class BlueBird extends Bird{
//這裏會出現編譯錯誤
public static void fly(){}
}
package characteristic.inherit._final;
/**
* 測試static方法是否可以被重載
* @author 學霸聯盟 - 趙燦
*/
public class RedBird extends Bird{
/*
* 這裏也會出現編譯錯誤
* 但是如果不寫@Override不會出現編譯錯誤
* 如果不寫@Override表示這個fire方法只屬於RedBird類
*/
@Override
public static void fire() {}
}
總結:被static和final修飾的方法都不能被重寫