wataruの部屋

20代駆け出しシステムエンジニア 低学歴な人生を歩んで来たため仕事させてくれる社会に感謝しています。 ブログの内容は映画やプログラミングに関することなど...

6章<継承とポリモーフィズム>

重要なポイントだけ殴り書きします。

・継承

・オーバーライド

・thisとsuper

・抽象クラス

・インターフェース

・基本データ型、参照型の型変換

ポリモフィズム

Java API

継承


・継承にはextends句を使用する。
Javaは多重継承をサポートしていないためextends句の後は1クラスのみ記述可
インターフェースは多重継承が可能

継承元のクラスをスーパークラス
継承したクラスをサブクラスと呼ぶ

継承を行うとスーパークラスメソッド変数をサブクラスに引き継ぐことができる。
privateなフィールドとスーパークラスのコンストラクタは引き継がれない

f:id:koko55120:20190225231056p:plain

すべてのクラスはobjectクラスを親に持つ。
※何も継承しないでクラスを定義してもobjectクラスを親に持つことになる。
なので、objectクラスのequalsメソッド等を使用することができる。

オーバーライド


オーバーライドの条件は以下の通り。

アクセス修飾子が元より同じか公開範囲の広いもの。
メソッド名と引数リストがすべて同じであること
戻り値が同じであるかその戻り値の型がサブクラスであればオーバーライドとしてみなされる

f:id:koko55120:20190225230045p:plain

thisとsuper


自信のオブジェクトを指す場合this句を使用する。
メソッドの引数と自オブジェクトの変数を分ける時などに使用する。

また、コンストラクタ内で使用すれば別のコンストラクタを呼ぶことができる。
ルールとしてコンストラクタ内の一番上に記載しなけれればならない。

自オブジェクトから見て親クラスを指すにはsuper();句を使う。
スーパークラスにあるメソッドや変数にアクセスできる。
f:id:koko55120:20190225231819p:plain
スーパークラスのコンストラクタを明示的に呼ぶこともできる。

こちらもthis句と同様コンストラクタ内で一番上に記載しなければならない。

つまり、コンストラクタ内でthisとsuperを同じ場所で書くのは不可能である。

抽象クラス

抽象クラスはabstract宣言をする。

抽象メソッドと実装メソッドを混在させることができる。

抽象クラスはインスタンス化できない。

共通の処理は抽象クラスにまとめ、必要に応じて継承させる使い方がセオリー

継承したサブクラスにメソッドのオーバーライドを強制させたりの役割がある。

インターフェース

実装はimplements 継承のextendsと混雑する場合、継承の後に記載する。

インターフェースはいくつも実装できる。

インターフェースは多重継承も可

実装を持つメソッドを宣言できない。

インタフェースに宣言できる内容は以下の通り。

static定数

staticメソッド

抽象メソッド

defaultメソッド

インターフェースでは変数を宣言しても定数として扱われる。
宣言時に自動でpublic static final修飾子が付与される。

メソッドも同様で自動でpublic abstractが修飾子が付与される。

抽象メソッドが一つのインターフェースを関数型インターフェースという。
※この説明は別でします

キャスト

基本的な考え。 基本データ型であれば、大きいデータ型から小さいデータ型への代入は不可能

参照型の場合、親クラス型の変数に子クラス型のオブジェクトを代入することは可能。
暗黙型変換という 基本データ型も参照型も必要に応じてキャスト(型変換)ができる。

f:id:koko55120:20190225234102p:plain

ポリモフィズム

日本語で言えば多態性。

オブジェクトによって必要な振る舞いを行う。

例.親クラスAと子クラスBに同一のメソッドがある状態(オーバーライド)してるとき。

  A obj = new A(); B obj = new B();


オブジェクトにあったメソッドを呼び出してくれる
f:id:koko55120:20190225235622p:plain

オブジェクトによって呼び出すメソッドが違う。
これが重要。

親クラス型で受け取るメソッドを用意して
変数名.メソッド呼び出しとしておけば将来
クラスが追加されてもインスタンスを渡すだけでよくなる

振る舞いが変わるとはいえ、フィールドに関しては宣言したクラス型に合わせて呼び出しされるので注意

f:id:koko55120:20190226000019p:plain

Java API

StringBuliderクラス
可変文字列を扱う

メソッドが以下

append(String s)

末尾にsを追加するメソッド。
末尾に追加されるためSQLを発行する際に使いたい

insert(int x, String s)
x番目にsを挿入する
(※引数はintやcharなどもOK)

replace(int a, int b, String s)
a番目~b番目の文字をsに置き換える

Stringクラスのreplaceメソッドと動きが違うので注意!

Stringクラスの場合はパターンマッチングです。
replace("置換前文字列","置換後文字列");

setCharAt(int a, char s)
a番目の文字をsに置き換える

delete(int a, int b)
a番目~b番目の文字を削除する

charAt(int a)
a番目の文字をchar型で取得する

indexOf(String s)
sが一番最初にくるインデックスを返す

lastIndexOf(String s, int a)
sがa番目より手前で一番最初に出現するインデックス番号を返す (存在しない場合は -1 が返る)

length()
文字列の長さ(文字数)を返す

substring(int a)
a番目以降をString型で返す

substring(int a, int b)
a番目~b番目をString型で返す

toString()
String型で返す

f:id:koko55120:20190302011300p:plain

f:id:koko55120:20190302011328p:plain

java8で追加されたもの

LocalDate(日付を扱うクラス)
LocalTime(時刻を扱うクラス)
LocalDateTimeクラス(日付と時刻を扱うクラス)
※すべてnewによるインスタンス化はできないので注意!

LocalDateから

static LocalDate now() f:id:koko55120:20190302004604p:plain

メソッドを実行した日付を保持するインスタンスを返す

static LocalDate of(int year, int month, int dayOfMonth)
f:id:koko55120:20190302005023p:plain
引数で指定した数値をもとに日付を保持したlocalDateクラスのインスタンスを返す。