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(); } }
コンストラクタ
子クラスにコンストラクタが無くても、親クラスのコンストラクタが呼ばれる
- 子クラスにはもちろん、親クラスに無いユニークなインスタンス変数を作成する場合が多いので、子クラスで作成したコンストラクタを用いて親クラスのコンストラクタをcallする(子クラスと親クラスにて共通する変数のみ)
- 子クラスから親クラスのメソッドを呼び出す際はsuper
を使います
- 子クラスのユニーク変数は子クラスのコンストラクタ内で初期化
アクセス修飾子
あとは、もちろんpublic
、protected
で宣言したメソッド、変数は子クラスから呼び出せる
(これが継承の醍醐味なんだろうけどいつも忘れる)
逆に言うと、親クラス側で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