抽象方法是 Java 的一個強大工具,在多態性方面賦予這種面向對象的語言更多的能力。Java 抽象方法可以用來為整個程序創建一個基本框架,並使您可以根據需要進行調整。Java 抽象方法與你 - 1

什麼是抽象方法?

抽象方法是沒有實現的方法。也就是說,它只有一個聲明,所以您知道名稱、返回類型和它將接受的變量。下面是一個基本抽象方法的例子:

public abstract int example(int a1, int a2);
當您查看此方法時,您會發現它返回一個整數並且接受兩個整數作為其參數。你不能說的是這個方法是如何實現的。那是因為要實現它,您必須覆蓋它。在 java 中創建抽象方法時,您必須遵守一些準則,否則您的程序將無法正確編譯。記住:
  • Java 抽象方法沒有實現。也就是說,它們後面永遠不應跟花括號和說明如何使用該方法的主體。它只是以分號結束。

  • 如果你創建了一個抽象方法,那隻能放到一個抽像類中。也就是說,您不能擁有一個內部具有抽象方法的具體類。
    我。作為旁注,如果你有一個抽像類,它可以包含構造函數。但是,它不必具有抽象方法。

  • 當一個具體類擴展一個抽像類時,它還必須實現父類的所有抽象方法,否則它就不能是具體的,必須聲明為抽象的。

最後兩個可能有點令人困惑,所以讓我們馬上把它弄清楚。

擴展抽象 Java 類

假設我們要編寫一個關於將返回周長和麵積的基本形狀的程序。所以我們創建一個父抽像類。但是因為每個形狀都有自己的規則,每個形狀都要計算不同,所以我們這樣 寫抽象的Shape類:

abstract class Shape {
  		String shapeName = " ";
  		Shape(String name) { 
    			this.shapeName = name; 
  		} 

abstract double area();
  		abstract double perimeter();
}
現在,如果我們想實際使用這些抽象方法,我們必須擴展抽象的 Java 父類Shape,然後實例化這些方法。所以每個具體類都必須實現area和perimeter抽象方法。

class Quadrilateral extends Shape  
{ 
    double length, width; 
      
    Quadrilateral(double l, double w, String name) 
    { 
        super(name); 
        this.length = l; 
        this.width = w; 
    } 
      
    @Override
    public double perimeter()  
    { 
        return ((2*length)+(2*width));
    } 
      
    @Override
    public double area()  
    { 
        return (length*width); 
    } 
}

Implementing the Quadrilateral class would then look like this
class Main
{ 
    public static void main (String[] args)  
    { 
      
        // creating a Quadrilateral object using Shape as reference 
        Shape rectangle = new Quadrilateral(3,4, "Rectangle"); 
        System.out.println("Area of rectangle is " + rectangle.area()); 
        System.out.println("Perimeter of rectangle is " + rectangle.perimeter());
  
    } 
} 
控制台的輸出如下所示:

Area of rectangle is 12.0
Perimeter of rectangle is 14.0
請注意,類Quadrilateral不必從父類Shape實例化Shape(String name)構造函數。那是因為它不是抽象方法。但是,如果您只在一個類中實現了一個區域或周界,那麼新類就必須是抽象的,因為它不包括這兩者。您還可以在接口中使用抽象方法。

具有接口的抽象 Java 方法

讓我們快速回顧一下接口是什麼以及它與抽像類的區別。在接口中,在接口中聲明的任何變量都是公共的、靜態的和最終的。另一方面,抽像類只有非最終變量。默認情況下,接口中的所有內容都是公開的。一個抽像類可以有 private、protected、public 等。最後,一個類不擴展接口,它實現它。在 JDK 8 之前,接口中只能包含抽象方法。現在,接口可以有默認方法和靜態方法。正因為如此,最佳實踐已經不再使用抽象方法作為可擴展模板,而是專注於接口和實現它們。因此,如果您要將Shape創建為接口,然後將其實現為四邊形, 它會是什麼樣子?首先,您必須取消Shape(String name)構造函數。只有兩個抽象方法看起來像這樣:

interface Shape {

  abstract double area();
  abstract double perimeter();
}


So the Quadrilateral class would then look like this:
class Quadrilateral implements Shape {  

  double length, width; 
      
    	  Quadrilateral(double l, double w) {
    
    	    this.length = l; 
    	    this.width = w; 
    	  } 
      
    	  @Override
    	  public double perimeter() {
     
    	    return ((2*length)+(2*width));
    	  } 
      
    	  @Override
    	  public double area() {
    
   	    return (length*width); 
    	  } 
}
最後,在實現Shape接口時 使用新的Quadrilateral將大同小異:

class Main
{ 
    public static void main (String[] args)  
    { 
      
        // creating a Quadrilateral object using Shape as reference 
        Shape rectangle = new Quadrilateral(3,4); 
        System.out.println("Area of rectangle is " + rectangle.area()); 
        System.out.println("Perimeter of rectangle is " + rectangle.perimeter());
  
    } 
}
控制台打印出來的是這樣的:

Area of rectangle is 12.0
Perimeter of rectangle is 14.0
如果您想進一步了解接口和抽像類之間的差異,可以在此處找到更多信息。

但為什麼要使用抽象 Java 方法?

使用 Java 中的抽象方法以及您應該習慣使用它們的原因有很多。以下是您應該在適當的時候使用它們的三個快速原因。
  1. 避免重複勞動——回顧一下我們的示例代碼;假設您和您的團隊需要為矩形以外的形狀創建類。您可以想出多少種不同的方法來設計該課程?十?十五?這是一個簡單的問題。想像一些更複雜的事情。您和您的團隊可以想出一百種方法。然後你將面臨將它們編織成一個連貫程序的艱鉅任務。這將我們帶到下一點:定義實現。

  2. Java 中的抽象方法允許定義使用和實現——當您使用抽像類或接口時,通過設計抽象方法,您正在定義其他人將如何與您的接口交互。這讓他們知道他們應該使用哪些變量以及他們可以期望哪些返回類型。
    雖然他們可以覆蓋它們並創建以獨特方式實現您的接口的具體類,但您仍然為您的代碼設定了核心用途。如果有人想實現 Shape,那麼他們必須覆蓋或實現周長和麵積。

  3. 可讀性和調試——擁有抽象方法將增強代碼的可讀性。當您編寫實現接口的類時,您知道要尋找什麼。您知道接口中的每個抽象方法都將在實現中,這使得閱讀和跟踪任何錯誤變得更加容易。抽象方法只是學習如何在 Java 和其他面向對象語言中正確使用多態性的開始。當您開始理解和使用它們時,您的編碼之旅將開啟全新的篇章。