0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

インターフェイス/抽象クラス/オーバーライド 

Last updated at Posted at 2019-12-04

初学者ですが、個人的な勉強のために書いたものです

##インターフェイス

インターフェイスとはクラスのような具体的な処理を提供するものではなく、決まり事を定めるために明示しとくものであり、実際の処理はインターフェイスを実装したクラスで定義する
これにより、プログラムを複数人で作るような会社の現場では、親の抽象クラスで子クラスに実装してほしいメソッドを抽象メソッドとして定義しておくことで、他の人が作成する子クラスでも、必ずそのメソッドを実装してもらえるという利点がある

※抽象メソッド・・・名前/型/引数だけを定義したメソッド

####①クラスから「型」だけ取り出したもの

※「型」・・・そのものの**「扱い方を決める方法」**であり、変数を宣言するときに、型を指定するのは変数の扱い方を決めるためである

・注意すべき点は、扱う対象そのものの種類と、型で指定する「扱うものの種類」は異なる概念であること。例えると、1という数値をint型で扱うのか、double型で扱うのか変えられるように種類と扱い方は異なるということ

####②ほかのクラスからの「扱い方」を規定したもの

・ほかのクラスから扱えるようにするために、規定するメソッドはすべてpublicと解釈されるため、インターフェイスはコンパイラによって自動的にpublicにされる
・インターフェイスで定義するメソッドは、protectdやprivateで修飾することはできない (Java8からdefault修飾子を付けることで中身も定義できるようになった)
・クラスがインターフェイスを継承するときにimplements(実現する)を使うことからわかるように**「規定を実現するクラス」**があって初めて動作する

####③インターフェイスは実装を持てない

インターフェイスは扱い方だけを規定しているので、実装を持てないため、インスタンスを生成して動的に動作するもの(動的に値が変わるもの)は記述できない
ただし、以下の二つの条件をどちらか満たしていれば記述可能

finalを使い、動的に値が変更されないこと(定数)
staticを使い、インスタンスを生成できないこと

####④インターフェイスの継承

・継承はextends(拡張する)を使うことからわかるようにクラス機能を拡張した新しいクラスを定義することができるが、インターフェイスにおいてもextendsで、あるインターフェイスを拡張した新しいインターフェイスを定義(継承)できる
クラスの多重継承は禁止だが、インターフェイスの多重実現は認められている

##抽象クラス

####①インターフェイスとクラスの両方の性質をもつ

実装を持つ具象メソッドと、実装を持たない抽象メソッドの両方を持つことができる
・抽象クラスに定義した具象メソッドは、その抽象クラスを継承したサブクラスが引き継ぐ
抽象メソッドは、そのサブクラスでオーバーライドして実装しなおさなくてはいけない

####②インスタンス化はできない

・インターフェイスのの特性(抽象メソッド)を持つ抽象クラスは、インターフェイス同様にインスタンス化できない
・インスタンス化できないことからわかるとおり、継承されて利用されることが前提である
・抽象クラスに定義した抽象メソッドはこれを継承した具象クラスが実装を提供しなければならない
・抽象クラスを継承した抽象クラスは、具象クラスのように必ずしも実装する必要はなく、元の抽象クラスを拡張し、新しい抽象メソッドを追加したり、既存の抽象メソッドをオーバーライドして実装することができる。

####③フィールド定義

・抽象クラスを継承したサブクラスのインスタンスには、抽象クラスのインスタンスが含まれる。つまり、抽象クラスを継承したサブクラスのインスタンスには抽象クラスのインスタンスが含まれ、型だけを提供するインターフェイスは定数フィールドしかできないが、抽象クラスには動的に値が変更できるフィールドが定義できる

##オーバーライド

オーバーライドは、サブクラスでスーパークラスに定義されたメソッドを再定義すること
多重定義を表すオーバーロードと間違えないように注意
####オーバーライドには3つルールがある
①メソッドの再定義のため、メソッドのシグニチャは同じでなければならない
 ※シグニチャ・・・メソッド名、引数リストの型、数、順番を組み合わせたもの
戻り値が同じか、サブクラスであること
アクセス修飾子は元の定義よりも緩くすることはできるが、厳しくすることはできない
 ・下記の例はInteger型がNumber型のサブクラスであるのでオーバーライドできる

Sample.java
public Number method{
//any code
}
Sample.java
public Integer method{
//any code
}

####オーバーライドは追加(再定義)
・オーバーライドは上書き(overwrite)ではなく、追加(再定義)なので、サブクラスのインスタンスには同じ名前のメソッドが複数存在していることになる。この場合、オーバーライドされたメソッドが使われる

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?