JavaSE入門學習24:Java面向對象補充
一Java中的Object類
Object類是全部Java類的父類。假設一個類沒有使用extendskeyword明白標識繼承另外一個類,那麽這個類默認
繼承Object類。
public class Person{ // } //等價於 public class Person extends Object{ // }
Object類中的方法,適合全部子類。
1)toString()方法
在Object類中定義有public String toString()方法,其返回值是String類型。描寫敘述當前對象的有關信息。在進行
String與其類型數據的連接操作時(如:System.ouy.println("info"+person)),將自己主動調用對象類的toString()方法。也可
以依據須要在用戶自己定義類型中重寫toString()方法
實例:
public class Test{ public static void main(String[] arge){ Dog d = new Dog(); System.out.println(d); System.out.println("d:"+d); System.out.println("d:"+d.toString()); } } class Dog{ public String toString(){ return "I am a dog"; } }
執行結果:
2)equals()方法
比較的是對象的引用是否指向同一塊內存地址。普通情況下比較兩個對象時比較它們的值是否一致。所以要進行
重寫。
Object類中定義有:public boolean equals(Object obj)方法提供定義對象類型
實例:
public class Test{ public static void main(String[] arge){ String s1 = new String("hello"); String s2 = new String("hello"); System.out.println(s1 == s2);//比較對象的地址 System.out.println(s1.equals(s2));//比較對象的內容 } }
執行結果:
二對象轉型(casting)
一個基類的引用類型變量能夠指向其子類的對象。
一個基類的引用不能夠訪問其子類對象新增的成員(屬性和方法);
能夠使用 引用變量 instanceof 類名 來推斷該引用型變量所指向的對象是否屬於該類或該類的子類。
子類的對象能夠當作基類的對象來使用稱作向上轉型(upcasting),反之稱為向下轉型(downcasting)。
向上轉型是基類或父類的引用指向子類對象。
這個在前面的樣例中我們遇到非常多,這裏就不再多說,能夠參考:JavaSE入門學習18:Java面向對象之多態。
三動態綁定(池綁定)與多態
動態綁定是指在運行期間(而非編譯期)推斷所引用對象的實際類型,依據事實上際的類型調用其對應的方法。
以下樣例中。依據Lady對象的成員變量pet所引用的不同的實際類型而調用對應的enjoy()方法。
也就是你new的是
那個類型調用的就是該類型的enjoy()方法
實例代碼:
class Animal{ private String name; //構造方法 Animal(String name){ this.name = name; } public void enjoy(){ System.out.println("叫聲......"); } } class Cat extends Animal{ private String eyesColor; //構造方法 Cat(String name,String eyesColor){ //調用父類的構造函數 super(name); this.eyesColor = eyesColor; } //重寫父類Animal的enjoy()方法 public void enjoy(){ System.out.println("貓叫聲......"); } } class Dog extends Animal{ private String furColor; //構造方法 Dog(String name,String furColor){ //調用父類的構造方法 super(name); this.furColor = furColor; } //重寫父類Animal的enjoy()方法 public void enjoy(){ System.out.println("狗叫聲......"); } } class Lady{ private String name; //引用類型變量成員 private Animal pet; //構造函數 Lady(String name,Animal pet){ this.name = name; this.pet = pet; } public void myPetEnjoy(){ pet.enjoy(); } } public class Test{ public static void main(String[] arge){ Cat c = new Cat("catname","blue"); Dog d = new Dog("dogname","black"); Lady l1 = new Lady("l1",c); Lady l2 = new Lady("l2",d); l1.myPetEnjoy(); l2.myPetEnjoy(); } }
執行結果:
對於可擴展性的理解:
改寫上述的樣例:
加入一個Bird類:
class Bird extends Animal{ //構造方法 Bird(){ //調用父類的構造方法 super("bird"); } //重寫父類Animal的enjoy()方法 public void enjoy(){ System.out.println("鳥叫聲......"); } }
改寫main方法:
public class Test{ public static void main(String[] arge){ Cat c = new Cat("catname","blue"); Dog d = new Dog("dogname","black"); Bird b = new Bird(); Lady l1 = new Lady("l1",c); Lady l2 = new Lady("l2",d); Lady l3 = new Lady("l3",b); l1.myPetEnjoy(); l2.myPetEnjoy(); l3.myPetEnjoy(); } }
執行結果:
多態特性對於系統可擴充性的重要性
繼續改寫鳥類:
class Bird extends Animal{ private String featherColor; //構造方法 Bird(String name,String featherColor){ //調用父類的構造方法 super(name); this.featherColor = featherColor; } //重寫父類Animal的enjoy()方法 public void enjoy(){ System.out.println("鳥叫聲......"); } }
改寫mian方法:
public class Test{ public static void main(String[] arge){ Lady l4 = new Lady("l4",new Bird("birdname","green")); l4.myPetEnjoy(); } }
執行結果:
多態的條件:
1)要有繼承
2)要有重寫3)父類引用指向子類對象
JavaSE入門學習24:Java面向對象補充