8
4

More than 3 years have passed since last update.

【java】【javaSliver】インタフェースと抽象クラスがややこしいのでまとめ

Posted at

この記事の目的

来週javaシルバーを受験するので、曖昧な部分を潰していくことに。
ちょっと混乱していたインタフェース抽象クラスについて整理しておこうかな。というのがこの記事の目的です。

混乱していた理由

「抽象メソッドはabstractをつけて宣言する。つけないとコンパイルエラー」と書かれていたり、
「省略した場合、暗黙的にpublic abstractが付与される」と書かれていたり・・・

「あれ?勘違い?」と混乱していました。
ので、一旦しっかり整理して混乱から脱出したかったんです。
今思えば、抽象メソッドと抽象クラス、インタフェースがごっちゃになっていたんだろうな。って思ってます。

ルール比較

インタフェースと抽象クラスで定義できるものを一覧でまとめました。整理整理。
メソッドとフィールド変数に分けて整理しました。

メソッドについて

まずはメソッドから。
インタフェース抽象クラスそれぞれでテーブルにまとめました。

インタフェースのメソッド達

定義できるもの アクセス修飾子 省略できる? その他
抽象メソッド public 省略してもpublic インタフェースだとabstractも省略できるよ。
defaultメソッド public 省略できちゃう ※SE8以降定義できるようになりました。
staticメソッド public or private 省略するとpublic ※SE8以降定義できるようになりました。

ポイント

  • インタフェースの場合で宣言する抽象メソッドはabstract修飾子も省略できるみたいです。
  • アクセス修飾子を記述しないとpublicになるってのが共通ルールですかね?
  • staticメソッドについては、アクセス修飾子がpublicに限らずprivateの指定もできちゃうのがちょっと厄介ですね。
なんで、インタフェースだとabstract修飾子を省略できるんだろ?

これは個人的にたどり着いた推測ですが・・・。
インタフェースでは基本的に抽象メソッドしか定義できない(SE8までは)ので、abstractを明示的に宣言しなくても、コンパイラが空気読んでabstractつけてくれるんだな。と考えることにしました。

抽象クラスのメソッド達

定義できるもの アクセス修飾子 省略できる? その他
抽象メソッド なんでもあれ abstractは必須。 アクセス修飾子は省略可。省略してもpublicとかにはならないよ
具象メソッド なんでもあれ 省略できちゃう アクセス修飾子は省略可。省略してもpublicとかにはならないよ

ポイント

  • インタフェースと違って、アクセス修飾子は自由に定義できちゃう。
  • アクセス修飾子を省略すると、具象クラスと一緒で、修飾子なしのメソッドとして扱っちゃう。
  • 抽象メソッドのabstract修飾子必須!!!
なんで、抽象クラスだとabstract修飾子を省略できないんだろう?

抽象クラスの中には、具象メソッドと抽象メソッドが混在するから、混乱しないように明示的にabstractをつけないといけないって考えることにしました。
(これも個人的にたどり着いた推測です。)

続いて、変数

インタフェース

フィールドの種類 定義できる?できない? staticを省略できる? その他
非static変数(インスタンス変数) 定義できない - インタフェースはインスタンス化できないからね。
static変数 定義できるけど、定数になるよ 省略できる 省略してもpublic static finalになっちゃう。

ポイント

  • インスタンス変数は定義できない
  • static変数は何がなんでもpublic stati finalになる

インタフェースはインスタンス化できないから、インスタンスした時の変数のことなんて考える必要ないですね。
だから定義できないってことですね。うん。納得。
インスタンス化はできないけど、型としては扱えちゃうからこれまたややこしポイントですね。

抽象クラス

フィールドの種類 定義できる?できない? staticを省略できる? その他
非static変数(インスタンス変数) 定義できる そもそもいらない アクセス修飾子はなんでも定義できちゃう。
static変数 定義できる 省略できない staticを省略したらインスタンス変数になってしまうよ。アクセス修飾子はなんでも定義できちゃう。

ポイント

  • 具象メソッドとなんら変わらない!

まとめ

  • インタフェース

    • 抽象メソッド → abstractは省略可能
    • defaultメソッド
    • staticメソッド → staticメソッドだけは privateでも扱える
    • static変数 → static 変数は定数としてしか使えない
  • 抽象クラス

    • 抽象クラス → abstractは絶対書く
    • 具象メソッド
    • static変数
    • 非static変数

さいごに

結構自分ようのメモになっちゃいましたが、やっぱりこうやって整理する時間は必要ですね。
もし、解釈が違う、間違っているなあればお手数をおかけしますが、ご指摘いただけますと幸いですm(_ _)m

8
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4