抽象クラスはJavaでfinalメソッドを持つことができますか?
12 に答える
もちろん。例として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
抽象クラスには、抽象でも最終でもない、通常のメソッドのみを持つメソッドを含めることもできます。これらのメソッドは抽象クラスで実装する必要がありますが、クラスを拡張してそれらをオーバーライドする必要があるかどうかは、実装者が決定します。
はい、できます。ただし、最終メソッド自体を抽象化することはできません (同じクラス内の他の非最終メソッドは抽象化できます)。
はい、「抽象」クラスに「最終」メソッドが存在する可能性があります。ただし、クラス内の「抽象」メソッドは 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
はい。
はい。
ヒント: お気に入りの IDE (Eclipse、NetBeans など) を起動して試してみてください。機能しない場合は文句を言います。
はい、これらのメソッドはサブクラスでオーバーライドできません。その例は、テンプレート メソッド パターンです...
はい、できます...もっと文字が必要です
もちろん、それはサブクラス化できることを意味しますが、その特定のメソッドをオーバーライドすることはできません。
抽象クラスでは、メソッドが定義されている場合と定義されていない場合があります。抽象クラスを拡張すると、それだけが意味を持つため、抽象呼び出しで宣言または定義したメソッドは、サブクラスでオーバーライドされます。したがって、Abstract クラスでメソッドを final として宣言でき、サブクラスでオーバーライドされます。
はい。修飾子を使用abstract
すると、クラスの実装の一部を省略できます (つまり、いくつかのabstract
メソッドを使用できます) が、制限はありません。