Java對象的特性:多態
Java面向對象的四大特性
繼承 封裝 多態 (抽象)
多態
同一個對象 體現出來的多種不同形態(身份) 將一種行爲表現出不同的效果
要想實現多態的效果 需要現有繼承關係
體現:
1.父類類型的引用 指向 子類的對象
Person p = new Teacher();
2.該引用只能調用父類中定義的屬性或方法
3.如果子類中將父類的方法重寫,那麼調取方法後執行的結果是子類重寫之後的那個結果
如果父類與子類有同名的屬性 執行父類的屬性
如果父類與子類有同名的方法(重載) 執行子類重寫之後的方法
4.若想要調用子類中獨有的成員
(強制類型轉化) 造型 鑄型 (向上/向下轉型)
5.造型時(強制向下轉型時) 可能會出現一個運行時異常
ClassCastException 造型 鑄型 異常
如果想要避免造型的異常 可以用instanceof關鍵字來進行判斷
對象 instanceof 類
案例
//動物類
public class Animal {
public String name = "Animal的name屬性";
public void eat(){
System.out.println("animal的喫飯方法");
}
public void sleep(){
System.out.println("animal的睡覺方法");
}
}
//人類
public class Person extends Animal{
public String name = "person的name屬性";
public void eat(){
System.out.println("person的喫飯方法");
}
public void sleep(){
System.out.println("人類的睡覺方法");
}
public void talk(){
System.out.println("人類的說話方法");
}
}
//豬
public class Pig extends Animal{
public String name = "pig的name屬性";
public void sleep(){
System.out.println("豬的睡覺方法");
}
}
//學生
public class Student extends Person {
public String name = "student的name屬性";
public void talk(){
System.out.println("學生遵守禮貌 應該好好說話");
}
public void study(){
System.out.println("好好學習 天天向上");
}
}
//老師
public class Teacher extends Person{
public String name = "teacher的name屬性";
public void eat(){
System.out.println("做老師的通常不按時喫飯");
}
public void teach(){
System.out.println("做老師的獨有方法 一般人不會講課 我會");
}
}
public class Test {
public static void main(String[] args){
//1.創建對象
//這個真是的老師 體現出來的身份是一個人的身份
// Person p = new Teacher();//自動向上轉型 Teacher--->Person
// p.eat();
// p.sleep();
// p.talk();
// //如果想要調用子類獨有的屬性或方法
// //需要將類型還原會真實類型 強制類型轉化 造型 向上轉型 向下轉型
// Teacher t = (Teacher)p;
// t.eat();
// t.sleep();
// t.talk();
// t.teach();
Object o = new Teacher();
o.hashCode();
o.toString();
System.out.println("------------------------");
Animal a = (Animal)o;
a.hashCode();
a.toString();
System.out.println(a.name);//animal的name屬性
a.sleep();//沒有重寫 person重寫了 person的sleep
a.eat();//執行teacher的eat方法
System.out.println("-----------------------");
Person p = (Person)o;
p.hashCode();
System.out.println(p.name);//person的name屬性
p.sleep();//人類的睡覺
p.eat();//老師的喫飯
p.talk();//人類的說話
System.out.println("----------------------");
Teacher t = (Teacher)o;
System.out.println(t.name);//老師的name
t.eat();//老師的喫飯
t.sleep();//人類睡覺
t.talk();//人類說話
t.teach();//老師的獨有方法
System.out.println("-------------------");
if(o instanceof Person){//對象是否屬於後面類型
System.out.println("類型匹配 可以造型");
// Student s = (Student)o;//運行時異常 ClassCastException
// s.study();
}else{
System.out.println("對不起 類型不匹配 不幫您造型啦 否則會出問題");
}
}
}