Java面向對象三大特性之一 多態


瞭解多態的及使用數組

認識多態
多態是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;複製代碼
相關文章
相關標籤/搜索