2009-08-19 76 views

回答

1

是的,這些方法不能在子類中被覆蓋。這方面的一個例子是模板方法模式...

+0

你應該給更多的解釋。模板方法並不意味着最終的,儘管它確實使生活更簡單。 – kdgregory 2009-08-19 11:46:59

+0

好吧,讓我們強烈建議最後:)我認爲這是一個錯誤,不使用最後的模板方法... – pgras 2009-08-19 12:07:48

1

是的,它可以...需要更多的字符

1

當然,這意味着你可以繼承它,但你不能覆蓋特定的方法。

0

是的。 abstract修飾符可以省略某些類的實現(即有一些abstract方法),但不會對您施加任何限制。

5

是的。提示:只需啓動您最喜歡的IDE(eclipse,netbeans等)並嘗試一下。它會抱怨,如果它不工作。

+7

-1。 SO的目的不是告訴人們「自己嘗試」。如果每個進行Internet搜索此問題的人都必須啓動IDE並嘗試使用它,那麼當有人可以提供完整而全面的問題答案時,這是浪費精力和時間的問題:http://stackoverflow.com/questions/1299398/1299434#1299434 – 2009-08-19 15:58:29

+1

是的,您的權利和我接受downvote,但這是keyur關於行中抽象類的第三個小問題,所以我提出了豁免。 – 2009-08-19 16:20:53

+0

@Andreas_D:我錯過了那個關於同一主題的許多問題,我已經看到了足夠多的「爲什麼不爲自己嘗試」,今天早上我的回答和評論是我對這個問題反應太快了。我已經刪除它(這是否意味着你得到你的代表?),因爲你的答案實際上並不正確。 – 2009-08-19 16:46:18

34

當然。以一個示例來看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

一個抽象類也可以具有既不是抽象也不是最終的方法,只是常規的方法。這些方法必須在抽象類中實現,但是由實現者決定擴展類是否需要重寫它們。

+0

優秀! Upvote提出模板方法模式 – 2009-08-24 21:37:21

+0

但是wats使用它 – Sawyer 2016-08-12 12:19:20

+0

@ B蜥蜴:優秀的答案!但是我有一個問題:如果playOneGame()方法是正常的(不是最終的)。這是一回事嗎?在這裏使用final而不是使用任何關鍵字有什麼好處?謝謝 – 2017-05-05 12:13:35

4

是的,它可以。但最終的方法不能是抽象的(同一個類中的其他非final方法可以)。

2

是的。

+1

它很好地變得懶惰,並在肯定和否定的答案,當用戶本身也懶得。我認爲你的回答值得從我這邊來。 – devsda 2012-09-16 14:41:04

+0

heh。 :) – Bombe 2012-09-19 20:10:56

0

在抽象類中的方法可以定義或不定義。如果我們擴展抽象類,那麼只有它是有意義的,所以我們在Abstract中聲明或定義的任何方法都稱它爲超類。所以我們可以在Abstract類中聲明一個方法作爲final,並且它將在子類中被覆蓋。

+3

我看到你想說的是什麼,但請編輯你的答案,因爲它現在很不清楚。 – szegedi 2012-10-04 16:31:19

2

是的,在「抽象」類中可能會有「最終」方法。 但是,類中的任何「抽象」方法都不能被聲明爲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

0

假設我想設計類有一些實現,但我不希望別人(子類)來實現它,但其他方法,那麼在這種情況下,我們需要一個最終實現的方法和明顯的選擇抽象類。

相關問題