この記事の目的
来週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