多型和抽象類

ckxllf發表於2019-12-23

  多型

  1.要實現多型,那麼必須存在父子關係(繼承關係或者實現介面)

  2.實現多型的方式:將父類物件的宣告指向子類物件,例如Pet pet = new Dog();

  例如:

  /*

  這是一個類名為Pet的父類

  */

  public class Pet {

  public void print() {

  System.out.println("----呼叫Pet父類的print方法-----");

  }

  }

  /*

  這是類名為Dog的第一個子類

  */

  public class Dog extends Pet{

  public void print() {

  System.out.println("-----呼叫Dog子類的print方法-----");

  }

  }

  /*

  這是類名為Cat的第二個子類

  */

  public class Cat extends Pet{

  public void print() {

  System.out.println("-----呼叫Cat子類的print方法----");

  }

  }

  /*

  這是類名為Test的測試類

  */

  public class Test {

  public static void main(String[] args) {

  Dog dog = new Dog();

  dog.print();

  //這裡的輸出結果為:(-----呼叫Dog子類的print方法-----)

  Cat cat = new Cat();

  cat.print();

  //這裡輸出的結果為:(-----呼叫Cat子類的print方法----)

  Pet pet = new Pet();

  pet.print();

  //這裡輸出的結果為:(-----呼叫Pet父類的print方法----)

  //這裡使用多型方法,將父類物件的宣告指向子類物件

  Pet pet1 = new Dog();

  pet1.print();

  //這裡輸出的結果為:(-----呼叫Dog子類的print方法-----)

  }

  }

  3.向上轉型:向上轉型就是將子類物件賦值給父類物件的過程

  4.實現多型以後,從表面上看呼叫的是父類的方法,實際呼叫的是子類覆蓋掉父類的方法

  public class Test {

  public static void main(String[] args) {

  //這就是向上轉型

  Pet pet1 = new Dog();

  //實現多型以後,從表面上看呼叫的是父類的方法,實際呼叫的是子類覆蓋掉父類的方法

  pet1.print();

  //這裡輸出的結果為:(-----呼叫Dog子類的print方法-----)

  }

  }

  5.向下轉型:向下轉型就是將多型的父類物件強制轉換成子類物件的過程

  6.當需要呼叫子類獨有的方法和屬性的時候,必須向下轉型

  public class Cat extends Pet{

  public void print() {

  System.out.println("-----呼叫Cat子類的print方法----");

  }

  //這是一個子類獨有的方法

  public void printCat() {

  System.out.println("----我是一隻貓----");

  }

  }

  public class Test {

  public static void main(String[] args) {

  //這就是向上轉型

  Pet pet2 = new Cat();

  //這就是向下轉型

  Cat cat2 = (Cat)pet2;

  //當需要呼叫子類獨有的方法和屬性的時候,必須向下轉型

  cat2.printCat();

  //輸出的結果為:(----我是一隻貓----)

  cat2.print();

  //輸出的結果為:(-----呼叫Cat子類的print方法----)

  }

  }

  注意:

  7.透過instanceof判斷當前的pet2物件是否是Dog物件,如果是返回值為true,否則返回值為false

  8.報錯資訊為:(Exception in thread “main” java.lang.ClassCastException: com.four.Pet cannot be cast to com.four.Cat at com.four.Test.main(Test.java:18))

  這是當時遇到的一個報錯,需要特別注意。解決方法如下:

  錯誤程式碼為:

  public class Test {

  public static void main(String[] args) {

  Pet pet2 = new Cat();

  Dog dog2 = (Dog)pet2;

  dog2.print();

  }

  }

  修改後的正確程式碼為:

  public class Test {

  public static void main(String[] args) {

  Pet pet2 = new Cat();

  //透過instanceof判斷當前的pet2物件是否是Dog物件,如果是返回值為true,否則返回值為false

  if(pet2 instanceof Dog) {

  Dog dog2 = (Dog)pet2;

  dog2.print();

  }else if(pet2 instanceof Cat) {

  Cat cat2 = (Cat)pet2;

  cat2.print();

  }

  }

  }

  抽象類

  1.抽象類的語法格式:修飾符 abstract class 類名{類體}

  2.定義抽象方法的格式:修飾符 abstract 返回值型別 方法名(引數列表)

  3.抽象類中可以定義普通方法,也可以定義抽象方法,普通類中不能定義抽象方法

  4.抽象類中可以定義構造方法,普通類也可以,當一個普通類繼承了抽象類之後,該普通類必須實現抽象類中的抽象方法 鄭州做婦科檢查價格

  /*

  這是一個類名為Animal的抽象類

  */

  public abstract class Animal {

  //這是定義的一個變數

  public String name;

  //這是一個名為print的普通方法

  public void print() {

  System.out.println("-----我的print方法-----");

  }

  //這是一個名為method的抽象方法

  public abstract void method();

  //這是一個無參的建構函式

  public Animal() {

  }

  //這是一個有參的建構函式

  public Animal(String name) {

  this.name = name;

  }

  }

  5.抽象類不能直接建立物件,如果要建立物件,則必須是多型的方式建立。

  例如

  錯誤案例,這樣寫會直接報錯。

  /*

  這是一個類名為Test的測試類

  */

  public class Test {

  public static void main(String[] args) {

  Animal animal = new Animal();

  }

  }

  真確案例:

  /*

  建立一個類名為Bird

  */

  public class Bird extends Animal{

  public void method() {

  System.out.println("-----我是一隻小鳥,我會飛------");

  }

  }

  public class Test {

  public static void main(String[] args) {

  //利用多型的方式建立抽象類的物件

  Animal animal = new Bird();

  animal.method();

  }

  }

  6.抽象類中的方法不能用private、final修飾,因為抽象類中的方法是用來被繼承的。

  總結

  抽象類的目的就是:抽象類的作用類似於“模板”,其目的是方便開發人員根據抽象類的格式來修改和建立新類。抽象類主要用於繼承,有利於程式的擴充套件。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69945560/viewspace-2670045/,如需轉載,請註明出處,否則將追究法律責任。

相關文章