JavaRush /Java Blog /Random-TW /問與答:是否可以在final類別中定義抽象方法?

問與答:是否可以在final類別中定義抽象方法?

在 Random-TW 群組發布
我的一位讀者在 Java 開發人員職位的電話面試中被問到了這個有趣且重要的問題。儘管他知道用Java語言不可能製作一個抽象類final,但他對問題的措辭感到困惑。答案很簡單:不, final類別中不能有抽象方法。為什麼?因為一旦你在Java語言類別中宣告了抽象方法,這個類別就會自動變成抽象的,而final你不能在Java語言中建立抽象類別。final這意味著 Java 類別中不能有 抽象方法。
問與答:是否可以在final類別中定義抽象方法? - 1
許多 Java 開發人員在回答這個問題時會因為措詞而感到困惑。即使提出問題的人熟悉一般概念,他可能沒有意識到一個類別在其中聲明了抽象方法後就變成了抽象,並且在Java中不能創建抽象類別final。這一點將這個問題與更常見和常見的問題區分開來:在Java中是否可以同時將一個類別聲明為abstract和final? 讓我們看一個範例程式碼來演示final不可能在類別中聲明抽象方法。讓Hello.java我們有public final一個名為 的類Hello,它有一個抽象方法print()
public final class Hello {
  public abstract void print();
}
在IDE中鍵入此程式碼,您將收到以下錯誤訊息,他們說它Hello必須是抽象類,以便可以在其中聲明抽象方法。
問與答:是否可以在final類別中定義抽象方法? - 2
問與答:是否可以在final類別中定義抽象方法? - 3
如果您在記事本中鍵入此程式碼並從命令列使用 javac 實用程式對其進行編譯,也會發生相同的情況。根據Java規範,一旦在類別中聲明了抽象方法,該類別就成為抽象類,並且由於final在Java中無法建立抽象類,因此編譯器將產生錯誤。對於 Java 語言中的頂層類別和巢狀類別都是如此。即使您在巢狀final類別中聲明抽象方法,錯誤也會是相同的。另一個相關問題是:Java中的抽象類別可以有靜態方法嗎? 答案:是的,可以,在抽象類別中聲明靜態方法沒有問題,因為使用靜態方法不需要建立類別的實例,只需使用類別名稱即可呼叫它們。我們可以修改範例以在類別中包含Hello一個方法main(),該方法在 Java 中是靜態的,如下所示:
public abstract class Hello {
  public abstract void print();
  public static void main(String args[]) {
     // Howой-то code
  }
}
如您所見,沒有拋出編譯錯誤。這段程式碼編譯沒有問題,因為在 Java 中你可以完全安全地在抽象類別中宣告靜態方法。 簡要結論final類別中聲明抽象方法是不可能的。因為一旦你這麼做了,根據 Java 規範,類別就會自動變成抽象的。由於finalJava中的類別不能是抽象的,這是不可接受的,編譯器將透過拋出錯誤來禁止你這樣做。但是你可以在final類別和抽象類別中宣告靜態方法,這沒有問題。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION