抽象クラスItem
の異なるバージョンが示されており、それぞれのメソッドがどのように宣言されているかが少し異なります。
選択肢A
abstract class Item {
public abstract int calcPrice(Item item); // これは抽象メソッドです。メソッド本体(実装)がなく、サブクラスによって実装されなければなりません。
public void print(Item item) { /* do something */ } // これは具体的なメソッドです。中括弧の中に実装があり、「何かをする」とコメントされています。
}
このクラスでは、calcPrice
メソッドが抽象メソッドとして宣言されており、サブクラスでのオーバーライド(具体的な実装)が必要です。一方で、print
メソッドは具体的な実装が提供されており、サブクラスでそのまま使用することも、オーバーライドすることもできます。
選択肢B, C, D
B, C, Dの選択肢にはいくつかの問題があります:
- 選択肢BとCでは、
calcPrice
メソッドは抽象メソッドとして宣言されていません。これはJavaでは許されていない実装です。抽象クラスには、メソッド本体なしに宣言される抽象メソッドが含まれていなければなりません。 - 選択肢Cでは、
print
メソッドにfinal
修飾子が使用されていますが、これは抽象クラス内で具体的なメソッドにfinal
を使用することは問題ありません。ただし、これはクラスが抽象的であるという事実とは関係がありません。 - 選択肢Dでは、メソッドに実装(中括弧で囲まれたコード)が提供されているにもかかわらず、メソッドが抽象として宣言されています。これはJavaの文法に反しています。抽象メソッドは実装を持つことができません。
したがって、正しい選択はAであり、その理由は、抽象クラスであるにもかかわらず、正しく抽象メソッドが宣言されており、具体的なメソッドも適切に含まれているからです。
Top comments (0)