' P '

whatever I will forget

java Inheritance

Javaの継承は extends を行うことで実装できる
ここらへんの内容はほぼC++と同じですかね

継承とは?

これを忘れるともう痴呆症... (実際忘れた)
- 継承は、親クラスのメソッド、メンバを子クラスに引き継ぐことができます
- 子クラス側からthis.変数名と見た際、親クラスのメンバ変数を参照している場合がある。(書き方がムズイですが、もし子クラスに指定された変数名がある場合はもちろん子クラスの変数を参照します。また、親クラスのメンバ変数はpublic及びprotectedで宣言されていないとダメです)
参照: stackoverflow.com

継承がされない場合 追記6/16

へえ〜となったのですが、継承されない場合があります。
それは親クラスと子クラスにて、staticで定義された同名義のメソッドがある場合です。
下記のような場合、出力結果はparentになります。これはひっかけ問題で必ずひっかかりますねw

class Parent {
    public static void show() {
        System.out.println("parent");
    }
}

class Child extends Parent {
    public static void show() {
        System.out.println("child");
    }
}

public class Main {
    public static void main(String[] args) {
        Parent p = new Child();
        p.show();
    }
}

stackoverflow.com

コンストラク

子クラスにコンストラクタが無くても、親クラスのコンストラクタが呼ばれる
- 子クラスにはもちろん、親クラスに無いユニークなインスタンス変数を作成する場合が多いので、子クラスで作成したコンストラクタを用いて親クラスのコンストラクタをcallする(子クラスと親クラスにて共通する変数のみ)
- 子クラスから親クラスのメソッドを呼び出す際はsuperを使います
- 子クラスのユニーク変数は子クラスのコンストラクタ内で初期化

アクセス修飾子

あとは、もちろんpublicprotectedで宣言したメソッド、変数は子クラスから呼び出せる
(これが継承の醍醐味なんだろうけどいつも忘れる)
逆に言うと、親クラス側でprivateにしてしまったメンバやメソッドは継承できません。

メソッド

子クラスでしか使わないようなメソッドはprivateで宣言しようね

override

@overrideとメソッド前につけることで親クラスのメソッドを子クラス側で、同じ名前のメソッドでユニークな機能を持ったfunctionに上書きできます
superを使うことで親クラスのoverrideしたメソッドも呼び出せます superは子クラスでoverrideしたメソッドをあえて使いたくない、親クラスを使いたい、という時にも使えます

とりあえず動きだけ確認したかったために作ったコードw

public class inheritanced {
    public static void main(String[] args) {
        //子クラスのオブジェクトつくる
        class_child test = new class_child();
        //親クラスのメソッド呼び出す
        test.how_old_are_you(20); 
        //子クラスから親クラスの変数使う
        test.how_old_are_you(test.age); 
    }
}
class class_inheri {
    protected int age;
    protected void how_old_are_you(int x){
        System.out.println(x);
    }
}

class class_child extends class_inheri {
    class_child() {
        //親クラスの変数にアクセスできてる
        age = 20; 
    }
}

20
20