8

抽象クラスはJavaでfinalメソッドを持つことができますか?

4

12 に答える 12

41

もちろん。例としてTemplate メソッド パターンを見てください。

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();
    }
}

拡張するクラスはすべての抽象メソッドを実装する必要がありますが、 final と宣言されているためGame拡張できません。playOneGame

抽象クラスには、抽象でも最終でもない、通常のメソッドのみを持つメソッドを含めることもできます。これらのメソッドは抽象クラスで実装する必要がありますが、クラスを拡張してそれらをオーバーライドする必要があるかどうかは、実装者が決定します。

于 2009-08-19T11:48:39.027 に答える
7

はい、できます。ただし、最終メソッド自体を抽象化することはできません (同じクラス内の他の非最終メソッドは抽象化できます)。

于 2009-08-19T11:50:22.970 に答える
6

はい、「抽象」クラスに「最終」メソッドが存在する可能性があります。ただし、クラス内の「抽象」メソッドは 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();
    }
}

出力:-

Yes
Overridden
Success overriding

ideone のリンクは次のとおりです:- http://ideone.com/G1UBR5

于 2015-09-03T12:35:16.377 に答える
2

はい。

于 2009-08-19T12:01:08.550 に答える
2

はい。

ヒント: お気に入りの IDE (Eclipse、NetBeans など) を起動して試してみてください。機能しない場合は文句を言います。

于 2009-08-19T11:47:06.567 に答える
1

はい、これらのメソッドはサブクラスでオーバーライドできません。その例は、テンプレート メソッド パターンです...

于 2009-08-19T11:45:59.080 に答える
1

はい、できます...もっと文字が必要です

于 2009-08-19T11:46:01.827 に答える
1

もちろん、それはサブクラス化できることを意味しますが、その特定のメソッドをオーバーライドすることはできません。

于 2009-08-19T11:46:11.950 に答える
0

抽象クラスでは、メソッドが定義されている場合と定義されていない場合があります。抽象クラスを拡張すると、それだけが意味を持つため、抽象呼び出しで宣言または定義したメソッドは、サブクラスでオーバーライドされます。したがって、Abstract クラスでメソッドを final として宣言でき、サブクラスでオーバーライドされます。

于 2012-10-04T11:32:04.907 に答える
0

はい。修飾子を使用abstractすると、クラスの実装の一部を省略できます (つまり、いくつかのabstractメソッドを使用できます) が、制限はありません。

于 2009-08-19T11:46:36.800 に答える