継承
JAVAの最大の特徴「継承」。
継承を利用してクラスを定義する際、もととなるクラスをスーパークラス、新たに作成したクラスをサブクラスと呼びます。
サブクラスを定義する際には、extendsキーワードを使用します。
[修飾子] class サブクラス名 extends スーパークラス名 { }
サブクラスをインスタンス化するとスーパークラスの変数、メソッドはサブクラスに引き継がれる。
図のように、既存のクラスをもとに複数のクラスを作ったり、継承したサブクラスからさらにサブクラスを作ることも可能です。
逆にサブクラスは、複数のスーパークラスから継承することはできません。
●final
変数を定数にする。と前項でやったの覚えていますか?
final修飾子は変数だけではなく、メソッドやクラスにも適用することができます。
①finalメソッド
ex1)
public final void method()
メソッドに付けると(サブクラスで)オーバーライドできない。
②finalクラス
ex2)
public final class Super { }
クラスに付けるとこのクラスを親にしたサブクラスを作れなくなる。
●this
そのクラスのオブジェクトを参照するオブジェクトです。
(変数、メソッド、コンストラクタに適用)
上記は、「出来る」というだけで、非常に分かり難いソースなので、実際の現場では使ってはいけません。
・thisでコンストラクタを呼び出す。
このようにコンストラクタの中から this() で別コンストラクタをコールできる。この時には「 this() をコンストラクタ内の先頭行に記述」がルール。
●super
スーパークラスのオブジェクトを表現します。(変数、メソッド、コンストラクタに適用)
要は、thisが自クラスを表現するのに対し、superは親クラスを表現します。
ん?
インスタンス化したら親クラスの変数、メソッドはそのまま使えるんじゃなかったの?
その通り!なので、
オーバーライドしている際などに明示的に親を指定する場合のみ使います。
this同様、コンストラクタが面倒。
superを使う際のルール
・サブクラスをインスタンス化すると
①スーパークラスのコンストラクタ
②サブクラスのコンストラクタ の順で実行される。
・サブクラスから明示的な指示がない時は、暗黙コールで引数がないコンストラクタがコールされる。
thisと同様、先頭行に記述する。
逆に明示的な指定(super(引数))があれば暗黙コールはされない。