DEV Community

TANIAOKA, Akihiro
TANIAOKA, Akihiro

Posted on • Updated on

12章32

抽象クラスItemの異なるバージョンが示されており、それぞれのメソッドがどのように宣言されているかが少し異なります。

選択肢A

abstract class Item {
  public abstract int calcPrice(Item item); // これは抽象メソッドです。メソッド本体(実装)がなく、サブクラスによって実装されなければなりません。

  public void print(Item item) { /* do something */ } // これは具体的なメソッドです。中括弧の中に実装があり、「何かをする」とコメントされています。
}
Enter fullscreen mode Exit fullscreen mode

このクラスでは、calcPrice メソッドが抽象メソッドとして宣言されており、サブクラスでのオーバーライド(具体的な実装)が必要です。一方で、print メソッドは具体的な実装が提供されており、サブクラスでそのまま使用することも、オーバーライドすることもできます。

選択肢B, C, D

B, C, Dの選択肢にはいくつかの問題があります:

  • 選択肢BとCでは、calcPrice メソッドは抽象メソッドとして宣言されていません。これはJavaでは許されていない実装です。抽象クラスには、メソッド本体なしに宣言される抽象メソッドが含まれていなければなりません。
  • 選択肢Cでは、print メソッドに final 修飾子が使用されていますが、これは抽象クラス内で具体的なメソッドに final を使用することは問題ありません。ただし、これはクラスが抽象的であるという事実とは関係がありません。
  • 選択肢Dでは、メソッドに実装(中括弧で囲まれたコード)が提供されているにもかかわらず、メソッドが抽象として宣言されています。これはJavaの文法に反しています。抽象メソッドは実装を持つことができません。

したがって、正しい選択はAであり、その理由は、抽象クラスであるにもかかわらず、正しく抽象メソッドが宣言されており、具体的なメソッドも適切に含まれているからです。

Top comments (0)