歡迎您光臨本站 註冊首頁

Java面向對象之繼承性的實例代碼詳解

←手機掃碼閱讀     lousu-xi @ 2020-06-07 , reply:0

一、類的繼承

A類繼承B類,是指A類可以擁有B類的非私有屬性和方法,同時A類也可以自己定義屬性方法或重寫方法以擴充自己的功能。

1.1 方法的重寫

重寫方法時,方法的方法名、返回值類型和參數個數及類型均需一致。    
    首先定義父類Animal,包含年齡、名字兩個屬性及吃的方法。

  public class Animal {   int age;   String name;   public void eat(){    System.out.println("動物可以吃東西");   }  }

   

通過子類Dog繼承父類Animal,並重寫eat方法,在調用重寫的eat方法之前,設置繼承來的年齡屬性值為10。

  public class Dog extends Animal{   public void eat(){    System.out.println(age+"歲的狗狗可以吃東西");   }   public static void main(String[] args) {    Dog dog1 = new Dog();    dog1.age = 10;    dog1.eat();//10歲的狗狗可以吃東西   }  }

   

1.2 繼承的初始化順序

初始化即執行類的構造方法,在Java中,繼承的初始化順序如下:

父類的屬性 > 父類的構造方法 > 子類的屬性 > 子類的構造方法

  public class Animal {   int age = 10;   public Animal(){    System.out.println("父類Animal執行了");    age = 20;   }  }  public class Dog extends Animal{   public Dog(){    System.out.println("子類Dog執行了");   }   public static void main(String[] args) {    Animal a = new Animal();    System.out.println(a.age);    Dog dog1 = new Dog();   }  }

   

運行結果如下圖所示:

   

當使用final關鍵字後,變量就成了常量,值不能被改變;方法也不能被繼承使用。

二、this與super

2.1 this關鍵字

this關鍵字代表當前對象,this.屬性代表操作當前對象的屬性,this.方法代表調用當前對象的方法。

2.2 super關鍵字

super在對象內部使用,代表父類對象。如果要調用父類的屬性age,使用super.age;如果要調用父類的方法eat(),使用super.eat()。如下代碼所示:

  public class Dog extends Animal{   int age = 20;   public void eat(){    System.out.println(age+"歲的狗狗可以吃東西");   }   public Dog(){    System.out.println("子類Dog執行了");   }   public void method(){    super.eat();   }   public static void main(String[] args) {    Dog dog1 = new Dog();    dog1.method();//動物可以吃東西   }  }

   

子類構造的過程當中,必須調用其父類的構造方法。在子類的構造方法第一句隱式的寫了一句          super();。        

  public class Dog extends Animal{   int age = 20;   public Dog(){    super();//寫與不寫都一樣,系統隱式調用    System.out.println("子類Dog執行了");   }   public static void main(String[] args) {    Dog dog1 = new Dog();    //父類Animal執行了    //子類Dog執行了   }  }

   

如果子類的構造方法中沒有顯示的調用父類的構造方法,則系統默認調用父類無參的構造方法。如果顯示的調用構造方法,必須在構造方法的第一行。

所以,如果子類的構造方法中既沒有顯示的調用父類的構造方法,而父類又沒有無參的構造方法,則編譯出錯。

三、Object類

Object類是所有類的父類,默認被所有類繼承。

3.1 toString()

toString()方法返回對象的地址(即Hash碼),如果要查看對象的屬性及屬性值,則可以重寫toString()方法(通過eclipse菜單中source可自動生成)。

  public class Dog extends Animal{   int age = 20;   @Override   public String toString() {    return "Dog [age=" + age + "]";   }   public static void main(String[] args) {    Dog dog1 = new Dog();    System.out.println(dog1.toString());//未重寫方法前的結果:Dog@15db9742    System.out.println(dog1.toString());//Dog [age=20]   }  }

   

3.2 equals()

equals()方法比較的是兩個對象的引用是否指向同一塊內存地址。

  public class Dog extends Animal{   public static void main(String[] args) {    Dog dog1 = new Dog();    Dog dog2 = new Dog();    if(dog1.equals(dog2)){     System.out.println("兩個對象相同");    }else{     System.out.println("兩個對象不同");    }   }  }

   

輸出的結果是“兩個對象不同”。如果僅需判斷兩個對象的屬性值是否相等,可以通過eclipse重寫equals方法。如下代碼所示:

  public class Dog extends Animal{   @Override   public boolean equals(Object obj) {    if (this == obj) //如果參數對象和當前對象相同,則一定相同     return true;    if (obj == null) //如果參數對象為空,則一定不同     return false;    if (getClass() != obj.getClass())//如果參數對象的類對象和當前對象的類對象不相等,則不相同     return false;    Dog other = (Dog) obj;//將參數進行強制轉換    if (age != other.age) //若屬性值相等,則相同     return false;    return true;   }   public static void main(String[] args) {    Dog dog1 = new Dog();    dog1.age = 15;    Dog dog2 = new Dog();    dog2.age = 15;    if(dog1.equals(dog2)){     System.out.println("兩個對象相同");    }else{     System.out.println("兩個對象不同");    }   }  }

   

最後輸出結果是,兩個對象相同。

注:文章根據本站相關課程的學習筆記整理而來,有錯誤或其他任何問題敬請指正,歡迎共同學習交流!


[lousu-xi ] Java面向對象之繼承性的實例代碼詳解已經有262次圍觀

http://coctec.com/docs/java/show-post-237378.html