Java 抽象類和抽象方法
在本教程中,我們将學習Java中的抽象。我們将學習Java抽象類和方法,以及如何在程式中使用它們。
Java 抽象類
抽象類是無法執行個體化的類(我們無法建立抽象類的對象)。在Java中,我們使用abstract關鍵字聲明一個抽象類。
abstract class Animal {
//屬性和方法
}
如果嘗試建立抽象類的對象,則會出現編譯錯誤。例如,
Animal a1 = new Animal()
它将産生一個編譯錯誤:Animal is abstract; cannot be instantiated
盡管不能執行個體化抽象類,但是我們可以從中建立子類。我們可以建立子類的對象來通路抽象類的成員。
在詳細了解它之前,我們需要了解抽象方法。
Java 抽象方法
我們使用相同的關鍵字abstract來建立抽象方法。聲明了一個抽象方法而沒有實作。例如,
abstract void makeSound();
在這裡,makeSound()是一種抽象方法。重要的是要注意,隻有一個抽象類才能包含抽象方法。如果我們在不是抽象的類中包含抽象方法,則會出現錯誤。
抽象類可以包含抽象方法和非抽象方法。這是一個執行個體。
abstract class Animal {
public void displayInfo() {
System.out.println(“I am an animal.”);
}
abstract void makeSound();
}
在上面的示例中,我們建立了一個抽象類Animal。它包含一個抽象方法makeSound()和一個非抽象方法displayInfo()。
抽象類的繼承
抽象類無法執行個體化。要通路抽象類的成員,我們必須繼承它。例如
示例1:抽象類的繼承abstract class Animal {
public void displayInfo() {
System.out.println("I am an animal.");
}
}
class Dog extends Animal {
}
class Main {
public static void main(String[] args) {
Dog d1 = new Dog();
d1.displayInfo();
}
}
輸出:I am an animal.
在上面的示例中,我們建立了一個抽象類Animal。我們不能建立Animal類的對象。為了通路Animal類中的displayInfo()方法,我們繼承了Animal的子類Dog。
然後,我們使用Dog的d1對象通路該displayInfo()方法。
重寫抽象方法
在Java中,必須在子類中重寫超類的抽象方法。這是因為子類繼承了超類的抽象方法。
因為我們的子類包含抽象方法,是以我們需要重寫它們。
注意:如果子類也被聲明為抽象,則不必強制重寫抽象方法。
示例2:覆寫抽象方法abstract class Animal {
abstract void makeSound();
public void eat() {
System.out.println("I can eat.");
}
}
class Dog extends Animal {
public void makeSound() {
System.out.println("Bark bark");
}
}
class Main {
public static void main(String[] args) {
Dog d1 = new Dog();
d1.makeSound();
d1.eat();
}
}
輸出:Bark bark.
I can eat.
在上面的示例中,我們建立了一個抽象類Animal。該類包含一個抽象方法makeSound()和一個非抽象方法eat()。
我們從超類Animal繼承了一個子類Dog。這裡,子類Dog覆寫了抽象方法displayInfo()。
然後我們建立了Dog的對象d1。使用該對象,我們調用了d1.displayInfo()和d1.eat()方法。
通路抽象類的構造函數
與非抽象類相似,我們使用super關鍵字從子類通路抽象類的構造函數。例如,
abstract class Animal {
Animal() {
….
}
}
class Dog extends Animal {
Dog() {
super();
...
}
}
在這裡,我們使用Dog的構造函數中的super()通路Animal類的構造函數。
注意,super 始終應是子類構造函數的第一條語句。通路Java超級關鍵字以了解更多資訊。
為什麼使用Java抽象?
抽象是面向對象程式設計的重要概念。抽象僅顯示所需的資訊,所有不必要的細節都保持隐藏。這使我們能夠通過使用更簡單,更進階的想法省略或隐藏細節來管理複雜性。
抽象的實際示例可以是機車制動器。我們知道刹車的作用。當我們踩刹車時,機車将停止。但是,制動器的工作對我們而言是隐藏的。
隐藏制動器工作原理的主要優點是,現在制造商可以為不同的機車使用不同的制動器,但是制動器的作用是相同的。
讓我們舉一個執行個體來幫助我們更好地了解Java抽象。
示例3:Java抽象abstract class Animal {
abstract void makeSound();
}
class Dog extends Animal {
public void makeSound() {
System.out.println("Bark bark.");
}
}
class Cat extends Animal {
public void makeSound() {
System.out.println("Meows ");
}
}
class Main {
public static void main(String[] args) {
Dog d1 = new Dog();
d1.makeSound();
Cat c1 = new Cat();
c1.makeSound();
}
}
輸出:Bark bark
Meows
在上面的示例中,我們建立了一個超類Animal。超類Animal具有抽象方法makeSound()。
makeSound()方法無法在Animal内部實作。這是因為每種動物都會發出不同的聲音。是以,Animal的所有子類都有不同的makeSound()實作方法。
我們不能以對Animal的所有子類都正确的方式在Animal中實作makeSound()。 是以,Animal中makeSound()的實作保持隐藏狀态。
在上面的示例中,Dog實作了它自己的makeSound()實作,Cat實作了自己的makeSound()。
要記住的要點我們使用abstract關鍵字來建立抽象類和方法。
抽象方法沒有任何實作(方法體)。
包含抽象方法的類也應該是抽象的。
我們不能建立抽象類的對象。
為了實作抽象類的功能,我們從其繼承子類并建立該子類的對象。
子類必須重寫抽象類的所有抽象方法。但是,如果子類被聲明為抽象的,則不必強制重寫抽象方法。
我們可以使用抽象類的引用來通路抽象類的靜态屬性和方法。例如,
Animal.staticMethod();
Java 接口
在Java中,接口類似于抽象類。但是,接口沒有任何非抽象方法。在下一個教程中,我們将學習有關接口的更多資訊。