抽象類可以在Java中有最終的方法嗎?抽象類可以有最終的方法嗎?
回答
是的,這些方法不能在子類中被覆蓋。這方面的一個例子是模板方法模式...
是的,它可以...需要更多的字符
當然,這意味着你可以繼承它,但你不能覆蓋特定的方法。
是的。 abstract
修飾符可以省略某些類的實現(即有一些abstract
方法),但不會對您施加任何限制。
是的。提示:只需啓動您最喜歡的IDE(eclipse,netbeans等)並嘗試一下。它會抱怨,如果它不工作。
-1。 SO的目的不是告訴人們「自己嘗試」。如果每個進行Internet搜索此問題的人都必須啓動IDE並嘗試使用它,那麼當有人可以提供完整而全面的問題答案時,這是浪費精力和時間的問題:http://stackoverflow.com/questions/1299398/1299434#1299434 – 2009-08-19 15:58:29
是的,您的權利和我接受downvote,但這是keyur關於行中抽象類的第三個小問題,所以我提出了豁免。 – 2009-08-19 16:20:53
@Andreas_D:我錯過了那個關於同一主題的許多問題,我已經看到了足夠多的「爲什麼不爲自己嘗試」,今天早上我的回答和評論是我對這個問題反應太快了。我已經刪除它(這是否意味着你得到你的代表?),因爲你的答案實際上並不正確。 – 2009-08-19 16:46:18
當然。以一個示例來看Template method pattern。
abstract class Game
{
protected int playersCount;
abstract void initializeGame();
abstract void makePlay(int player);
abstract boolean endOfGame();
abstract void printWinner();
/* A template method : */
final void playOneGame(int playersCount) {
this.playersCount = playersCount;
initializeGame();
int j = 0;
while (!endOfGame()) {
makePlay(j);
j = (j + 1) % playersCount;
}
printWinner();
}
}
類擴展Game
仍然需要實現所有抽象方法,但是他們會不能因爲它最終宣佈延長playOneGame
。
一個抽象類也可以具有既不是抽象也不是最終的方法,只是常規的方法。這些方法必須在抽象類中實現,但是由實現者決定擴展類是否需要重寫它們。
優秀! Upvote提出模板方法模式 – 2009-08-24 21:37:21
但是wats使用它 – Sawyer 2016-08-12 12:19:20
@ B蜥蜴:優秀的答案!但是我有一個問題:如果playOneGame()方法是正常的(不是最終的)。這是一回事嗎?在這裏使用final而不是使用任何關鍵字有什麼好處?謝謝 – 2017-05-05 12:13:35
是的,它可以。但最終的方法不能是抽象的(同一個類中的其他非final方法可以)。
在抽象類中的方法可以定義或不定義。如果我們擴展抽象類,那麼只有它是有意義的,所以我們在Abstract中聲明或定義的任何方法都稱它爲超類。所以我們可以在Abstract類中聲明一個方法作爲final,並且它將在子類中被覆蓋。
我看到你想說的是什麼,但請編輯你的答案,因爲它現在很不清楚。 – szegedi 2012-10-04 16:31:19
是的,在「抽象」類中可能會有「最終」方法。 但是,類中的任何「抽象」方法都不能被聲明爲final。 它會給「修改器的非法組合:摘要和最終」錯誤。
public abstract final void show();
illegal combination of modifiers: abstract and final
這是實施的工作示例。
abstract class Sian //ABSTRACT CLASS
{
public final void show() // FINAL METHOD
{
System.out.println("Yes");
}
public void display()
{
System.out.println("Overriding");
}
public abstract void success();
}
class Ideone extends Sian //INHERTING ABSTRACT CLASS
{
public void display()
{
System.out.println("Overridden");
}
public void success() //OVERRIDING THE ABSTRACT METHOD
{
System.out.println("Success overriding");
}
public static void main (String[] args) throws java.lang.Exception
{
Ideone id = new Ideone(); //OBJECT OF SUBCLASS
id.show(); //CALLING FINAL METHOD
id.display(); //OVERRIDDEN METHODS
id.success();
}
}
OUTPUT: -
Yes
Overridden
Success overriding
這裏是ideone鏈接: - http://ideone.com/G1UBR5
假設我想設計類有一些實現,但我不希望別人(子類)來實現它,但其他方法,那麼在這種情況下,我們需要一個最終實現的方法和明顯的選擇抽象類。
- 1. 我可以在抽象類中有私人最終字段嗎
- 2. Java最終抽象類
- 3. 可以省略C#中抽象類中的接口方法嗎?
- 4. 我可以使用最終對象的方法嗎?
- 5. 有什麼辦法可以在java中實現'抽象類方法'嗎?
- 6. 即使沒有抽象方法,類也可以抽象嗎?如果是的話有什麼用?
- 7. 具有抽象類參數的抽象方法的Java抽象類
- 8. 我可以從另一個抽象派生類中的基類調用抽象方法嗎?
- 9. 調用抽象類的私有方法
- 10. 可選的抽象方法
- 11. 建議從抽象類中的方法調用抽象方法
- 12. 我可以強制抽象類的方法返回一些東西嗎?
- 13. Eclipse的重構重寫方法成最終和抽象部分
- 14. 抽象工廠和工廠方法可以一起使用嗎?
- 15. 我可以從另一個抽象類繼承抽象類嗎? (JAVA)
- 16. 我可以繼承具有另一個也是子類的抽象類的抽象類嗎? (C#)
- 17. 是否所有非抽象類都是最終的?
- 18. 元類可以有方法嗎?
- 19. 抽象類沒有任何抽象方法
- 20. 我可以在抽象類中創建靜態工廠方法嗎?
- 21. 使用抽象數據類型「STACK」可以找到迴文其他方法嗎?
- 22. 抽象類工廠方法
- 23. 抽象類方法聲明
- 24. 使用抽象類方法
- 25. 抽象方法重寫抽象方法
- 26. 你可以在C++的抽象類中使用抽象函數嗎?
- 27. 抽象類的XmlRootElement註釋 - 可能嗎?
- 28. 抽象類的方法覆蓋另一個抽象類
- 29. 是否可以使用最終的靜態類方法?
- 30. 是否有可能只覆蓋n方法中的接口或抽象類中所需的抽象方法?
你應該給更多的解釋。模板方法並不意味着最終的,儘管它確實使生活更簡單。 – kdgregory 2009-08-19 11:46:59
好吧,讓我們強烈建議最後:)我認爲這是一個錯誤,不使用最後的模板方法... – pgras 2009-08-19 12:07:48