java メモ

研修でjava習ってる新人が「abstractとinterfaceの違いとそれぞれのメリット・デメリットを教えて」ってメール送ってきたから、私も知りません と返すわけにもいかず調べたのでメモ。


新人はみんな分からないことがあると貰った資料や書籍で調べます、復習します って言うけどなんでネットで調べますって人はいないんだろ。
ネットで調べますってゆーのは悪印象を与えるイメージがあるのか?


悪印象と言えば日報で「研修が護送船団方式でイライラします」って送ってきてた新人がいた。
護送船団方式とか初めて聞いたよ。
その日報を送られた先輩は悪印象を持ったみたいだけど、先輩に対して強気な後輩って私は好きだな。ははは。

名前を決めているだけですので、中身は何も記述しません。
このようなメソッドのことを「抽象メソッド」といいます。
抽象メソッドはメソッドの頭に「abstract」と記述します。

抽象メソッドを持っているクラスのことを「抽象クラス」といいます。
抽象クラスはクラスの先頭に「abstract」と記述します。
abstract class Goods{
この部分ですね。

このような抽象クラスを継承してサブクラスを作った場合、サブクラスで抽象メソッドを必ず実装しなくてはいけません。

インタフェース内でメンバ変数を宣言する場合、そのメンバ変数は暗黙的にpublic、static、finalの修飾子が付与されます。final修飾子が付与されることからもインタフェース内で宣言されたメンバ変数は定数と言うことができます。メンバ変数宣言時に明示的にこれらの修飾子を付与する必要はありません。

インタフェース内でメソッドを宣言する場合、そのメソッドは暗黙的にpublic、abstractの修飾子が付与されます。abstract修飾子が付与されていることからもインタフェース内で宣言されたメソッドは抽象メソッドと言うことができます。メソッド宣言時に明示的にこれらの修飾子を付与する必要はありません。抽象メソッドであるため、インタフェース内でメソッドを宣言する場合、メソッドのヘッダー部分のみを宣言します。メソッド本体の定義はインタフェースを実装したクラス内で行います。

インタフェースを実装したクラスでメソッドの本体を定義すると言うことを考えると、abstractクラスを継承したクラスでabstractメソッドの本体を定義するというのとよく似ています。インタフェースとabstractクラスには以下に示すような違いがあります。

・ インタフェースではどのメソッドも本体を定義することはできませんが、abstractクラスには本体を定義したメソッド(abstractでないメソッド)を含めることができます。
・ インタフェースは複数実装できますが、abstractクラスは1つのみしか継承できません(多重継承がサポートされていないため)。
・ abstractクラスは継承したクラスとの間にクラス関係を意識する必要がありますが、インタフェースは実装したクラスとの間にクラス関係を意識する必要はありません。