瞭解多態的及使用數組
認識多態
多態是Java面向對象中的一個重要特性。
在程序中,它意味着一個特定類型的變量能夠引用不用類型的對象,而且能自主地調用對象的方法,
也就是根據做用到不一樣類型對象類型,響應不一樣的操做。
方法從寫是實現多態的基礎。
多態: 父類的引用能夠傳入子類的對象bash
多態的最基本使用方法:
1.父類的引用做爲方法的形參:ui
public void toHospital(Pet pet) {
System.out.println("給寵物掛號");
System.out.println("給寵物吃藥....");
pet.setHealth(pet.getHealth() + 5);
}
複製代碼
2.父類的引用能夠做爲方法的返回值類型this
// 2.父類的引用做爲方法的返回值類型spa
public Pet runPet(int choice) {
if(choice == 1) {
Dog dog = new Dog("小黃", 20, 60, "阿拉加斯");
System.out.println("開心的咬了陳旭!");
return dog;
}else if(choice == 2) {
Cat cat = new Cat();
cat.setName("小綠");
cat.setHealth(40);
cat.setLove(60);
cat.setGender('母');
System.out.println("開心的跳起來了");
return cat;
}
return null;
}
複製代碼
舉例說明
有一個寵物類Pet;它有幾個子類,如Bird ,Dog
寵物類定義了看病的方法toHospital();子類分別重寫了看病的方法。
例1:3d
//Pet 父類
class Pet{
public void toHospital(){
System.out.println("寵物看病");
}
}
//Dog 子類繼承父類
class Dog extends Pet{
public void toHospital(){
System.out.println("狗狗看病");
}
}
//Birad 子類繼承Pet父類
class Birad extendsPet{
public void toHospital(){
System.out.println("小鳥看病");
}
}
複製代碼
//以上爲Pet和其子類代碼,如下是調用代碼code
public class Test {
public static void main(String[] args){
Dog dog = new Dog();
dog.toHospital();//狗狗看病
Bird bird = new Bird ();
bird.toHospital();//鳥看病
}
}
輸出結果:
狗狗看病
鳥看病
複製代碼
下面用多態的形式進行修改:cdn
public class Test{
public static void main(String[] args){
Pet pet;
pet = new Dog();
pet.toHospital();//狗狗看病
pet = new Bird();
pet.toHospial();//鳥看病
}
}
複製代碼
多態意味着在一次方法調用中根據包好的對象的實際類型()
即實際的子類對象來決定應該調用那個方法,而不是由用來存儲對象引用的變量的類型決定的。對象
向上轉型
子類象父類的的轉換方法稱爲向上轉型。
語法格式:blog
<父類型> <引用變量名> = new <子類型>();
複製代碼
例如以前的例子中
//Pet爲父類 Dog爲子類
Pet pet = new Dog();//子類到父類的轉換
這就是向上轉型。
向下轉型:
將一個指向子類對象的父類引用賦給一個子類的引用,即將父類類型轉換爲子類類型,稱爲向下轉型。相似於 int num = (int)10.1;
語法格式:
<子類型> <引用變量名> = (<子類型>) <父類型的引用變量名>;
Cat cat = (Cat)pet;
cat.setGender();
複製代碼
在類型轉換時,極可能出現問題,父類的引用指向的對象和你要轉換的爲的類型不匹配,因此爲了不這種問題,通常都要添加instanceof判斷。
例:
if(pet instanceof Cat){
Cat cat = (Cat)pet;
cat.setGender();
}
複製代碼
String的equals方法:
// Object類的此方法 是給全部的類使用的 但願全部的類在比較相等時都採用此方法 // 因此使用了多態:父類的引用(Object anObject)做爲方法的形參 將此方法可擴展性大大的提高了 // 繼承自Object類 而且進行了重寫 方便咱們進行[字符串的相等比較]
/*
String str1 = 「hello World」;
String str2 = 「hello WoRld」;
str1.equals(str2)
*/
public boolean equals(Object anObject) {
// str1:this anObject:str2
// 判斷地址值是否相同 == 比較引用數據類型 比較地址值
if (this == anObject) {
return true;
}
// 判斷要比較的對象 是不是String類型 緣由是Object類型多態能夠傳入任何類型的子類對象 貓、狗
if (anObject instanceof String) {
// 向下類型轉型 由於Object是父類 父類的引用沒法直接使用子類的特有信息
String anotherString = (String)anObject;
// 獲取this的字符數組長度 (String底層是char數組)
int n = value.length;
// 獲取anObject的字符數組長度 判斷是否和this的字符數組長度相同
if (n == anotherString.value.length) {
// 獲取this的字符數組
char v1[] = value;
// 獲取anObject的字符數組
char v2[] = anotherString.value;
// 循環比較兩個字符數組的每個元素是否相同
int i = 0;
while (n-- != 0) {
// 只要有不一樣的內容 直接返回false
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;複製代碼