*継承 [#xcf71d3e]
#contents
**継承について [#r3c7716c]
 class クラス名1 extends クラス名2{
 }

という記述で継承していきます。~

クラス名1はクラス名2のサブクラス、クラス名2はクラス名1のスーパークラスになります。~


''継承のソースと継承の図''
#codeprettify{{
 class x{
     int i;
 }
 
 class x1 extend x{
     int i2;
 }
 
 class x2 extend x1{
     int i3;
 }
 
 class x3 extend x1{
     int i4;
 }
}}
            x
     x1のsuper class
       x1がxを継承
            ↓
            x1
       xのsub class
    x2とx3のsuper class
      ┌──┴──┐
      ↓     ↓
 x2がx1を継承 x3がx1を継承
      ↓     ↓
      x2      x3
 x1のsub class x1のsub class

なので~
 x2.i;
 x4.i2;
 x2.i3;
という値の参照が可能

----
継承関係にあるクラス内で同じ名前の変数がある場合、継承先の変数に隠される。~
隠された変数を参照したい場合はsuper.をつけると参照できる~

''継承のソースと継承の図''
#codeprettify{{
 class x{
     int i;
 }
 
 class x1 extend x{
     int i2;
 }
 
 class x2 extend x1{
     String i;
 }
 class x3 extend x1{
     int i4;
 }

}}
この場合、Xにi,x2にiがあります。~
しかし、x2はxを継承しています。継承先です。~
継承先の変数は継承元と同じ変数名のものを隠してしまうので
x2.iとやってもiはString型として扱われます。~

#codeprettify{{
 class x1{
     int i = 1;
 }
 
 class x2 extends x1{
     int i = 2;
 
     void display(){
         System.out.println(i);          //x2.iを参照している
         System.out.println(super.i);    //こうすると、x2.iではなくx1.iを参照する
     }
 }
 
 class mainprg{
     public static void main(String args[]){
         x2 xx = new x2();
         xx.display();
     }
 }

}}
継承関係にあるなかで、メソッドがオーバーライドしている場合、
型(引数とか)をみてメソッドを実行します。

#codeprettify{{
 class a1{
     void hello(){
         System.out.println("hello! a1");
     }
 }
 
 class b1 extends a1{
     void hello(int i){
         System.out.println("hello! b2");
     }
 }
 
 class c1 extends b1{
     void hello(){
         System.out.println("hello! c2");
     }
 }
 
 class hello_out{
     public static void main(String args[]){
         a1 obj new c1(String s);
         obj.hello();
     }
 }

}}
といった場合、当てはまるものはb1のhelloメソッドです。~

a1,b1,c1のhelloメソッドがすべて
#codeprettify{{
 void hello{
         System.out.println("hello! メソッド名");
 }

}}
で、上記のソースの場合はc1のhelloメソッドが呼び出されます。

**スーパークラスのコンストラクタの呼び出し [#zdbfc3cd]
継承関係にあるもののコンストラクタを呼ぶ場合、
スーパークラスのコンストラクタも呼ばなければなりません。~
スーパークラスのコンストラクタの呼び方は

 super(引数:省略可);

です。~

スーパークラスのコンストラクタの呼び出しは、サブクラスのコンストラクタの
最初のステートメントで行わないといけません。~
先にスーパークラスのコンストラクタを呼び出すことによりコンパイルエラーを防げるので。

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS