天天看點

java抽象類與抽象方法_Java 抽象類和抽象方法

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中,接口類似于抽象類。但是,接口沒有任何非抽象方法。在下一個教程中,我們将學習有關接口的更多資訊。