継承とは:SJC-P(310-035)対策Java用語集

Java認定資格(SJC-P/310-035)を一発合格したい!
このサイトは、そんなあなたを本気で応援します!!
SJC-P(310-035)対策のメルマガ問題集も好評発刊中。
ぜひあなたの受験に役立ててください。
メールマガジンの購読はもちろん無料です!

登録はこちらから→SJC-P対策メルマガ問題集
TOP    >>    SJC-P対策Java用語集    >>    継承

Java用語集:継承

継承について:簡単に説明すると

継承とは、スーパークラスからメンバを引き継ぐことです。
スーパークラスから継承するクラスはサブクラスと呼ばれます。

継承について:もっと詳しく

まずは継承を行わないコードを見てみましょう。
以下のコードを見てください。

//コード1
class Test{
   public static void main( String argv[] ){
      Shogun shogun = new Shogun();
      System.out.println( "shogunの役職は" + shogun.getPost() );
   }
}

class Shogun{
   String post = "征夷大将軍";
   public String getPost(){
      return( post );
   }
}
>javac Test.java

>java Test
shogunの役職は征夷大将軍

これは特に難しいところはありませんね。
では次に継承を利用したコードを見てみます。

//コード2
class Test{
   public static void main( String argv[] ){
      Tokugawa tokugawa = new Tokugawa();
      System.out.println( "tokugawaの役職は" + tokugawa.getPost() );
   }
}

class Shogun{
   String post = "征夷大将軍";
   public String getPost(){
      return( post );
   }
}

class Tokugawa extends Shogun{
/* 自分では何も宣言しない。Shogun からフィールドを継承する */
}

赤い部分が追加・変更した部分です。
新しく追加したクラス Tokugawa は extends節でスーパークラスを Shogun に指定しています。
このように、スーパークラスを指定すると、スーパークラスのフィールドをすべて継承します。
つまり、スーパークラスで宣言されている post(フィールド)と getPost() (メソッド)の2つのメンバが Tokugawa には引き継がれているのです。
そのため、Tokugawa は何も宣言していないのに、継承したメンバにアクセスすることができます。

きちんと継承されていることを確認するために実行してみましょう。

>javac Test.java

>java Test
tokugawaの役職は征夷大将軍

スーパークラスから引き継がれたメンバにアクセスできている様子が分かりますね。
Tokugawa クラスでは何も宣言していないけど、スーパークラスから継承を行っているため getPost() にアクセスすることが できています。
これが継承の基本です。しっかりおさえておきましょう。

念のためフィールドにも直接アクセスしてみます。

//コード3
class Test{
   public static void main( String argv[] ){
      Tokugawa tokugawa = new Tokugawa();
      System.out.println("tokugawaのpostは" + tokugawa.post);
   }
}

class Shogun{
   String post = "征夷大将軍";
   public String getPost(){
      return( post );
   }
}

class Tokugawa extends Shogun{
/* 自分では何も宣言しない。Shogun からフィールドを継承する */
}
>javac Test.java

>java Test
tokugawaのpostは征夷大将軍

Tokugawa が Shogun のフィールド( post )を継承し、直接アクセスできる様子が分かると思います。

ちなみにスーパークラスとは、メンバを継承されるクラスのことです。
この例では Shogun のことですね。
サブクラスとは、スーパークラスのメンバを継承するクラスのことで、この例では Tokugawa が Shogun のサブクラスということになります。

スーパークラスサブクラス
Shogun→継承→Tokugawa

ところで、なぜ継承という考え方が導入されたのでしょうか。
簡単に言ってしまうと便利だからです。
特に次のようなメリットがあります。

  • 継承を行うことで、既存の記述が再利用できる。
    その結果、コードの記述が簡略化される。
  • 共通した性質をスーパークラスにまとめることができる。
    その結果、クラスを共通の性質をもつグループに分けて管理することができる。

コード2コード3 の例で言えば、クラス Tokugawa では何も宣言していないのに、スーパークラス Shogun で宣言した メンバを継承して利用できました。
つまり、継承を行うことで既にあるコードを記述する手続きが簡略化されたわけですね。
具体的にいうならば、Tokugawa クラスは post と getPost() を記述する手間を省くことができるのです。
さらに必要であればサブクラスで記述を追加することができます。
次のコードを見てください。

//コード4
class Test{
   public static void main( String argv[] ){
      Tokugawa tokugawa = new Tokugawa();
      System.out.println("tokugawaの役職は" + tokugawa.getPost() );
      System.out.println("tokugawaの姓は" + tokugawa.getLastName() );
   }
}

class Shogun{
   String post = "征夷大将軍";
   public String getPost(){
      return( post );
   }
}

class Tokugawa extends Shogun{
   String lastName = "徳川";
   public String getLastName(){
      return( lastName );
   }
}

スーパークラスから継承したメンバに加えて、自分でさらにメンバを追加しています。
実行して確認してみましょう。

>javac Test.java

>java Test
tokugawaの役職は征夷大将軍
tokugawaの姓は徳川

また継承は自分の直接のスーパークラスだけではなく、スーパークラスのスーパークラスのメンバも引き継ぎます
さらに、スーパークラスのスーパークラスのスーパークラスのスーパークラスの・・・スーパークラスのメンバも引き継ぎます。
つまり先祖代々の資産がすべて引き継がれるのです。

どういうことが分かりにくいと思うので、コードを使って実際に確認してみましょう。

//コード5
class Test{
   public static void main( String argv[] ){
      Ieyasu ieyasu = new Ieyasu();
      System.out.println("ieyasuの役職は" + ieyasu.getPost() );
      System.out.println("ieyasuの姓は" + ieyasu.getLastName() );
      System.out.println("ieyasuの名は" + ieyasu.getFirstName() );
      System.out.println("ieyasuの姓名は" + ieyasu.getFullName() );
   }
}

class Shogun{
   String post = "征夷大将軍";
   public String getPost(){ return( post ); }
}

class Tokugawa extends Shogun{
   String lastName = "徳川";
   public String getLastName(){ return( lastName ); }
}

class Ieyasu extends Tokugawa{
   String firstName = "家康";
   public String getFirstName(){ return( firstName ); }
   public String getFullName() { return( lastName + firstName ); }
}

>javac Test.java

>java Test
ieyasuの役職は征夷大将軍
ieyasuの姓は徳川
ieyasuの名は家康
ieyasuの姓名は徳川家康

Shogun -> Tokugawa -> Ieyasu とメンバが継承されている様子が分かるかと思います。
そのため Ieyasu では getLastName() も getPost() も宣言していないのに利用することができます。
このように継承を行うことで、サブクラスの記述を簡略化できるというのが継承のメリットの一つなのです。

では、もう一つのメリットである共通した性質をスーパークラスにまとめる、というのはどういうことでしょうか。
言葉で説明するよりコードの方が分かりやすいと思うので、まずは以下のコードを見てください。

//コード6
class Test{
   public static void main( String argv[] ){
      Ieyasu ieyasu = new Ieyasu();
      Hidetada hidetada = new Hidetada();
      Iemitsu iemitsu = new Iemitsu();
      System.out.println("ieyasuの役職は" + ieyasu.getPost() );
      System.out.println("ieyasuの姓は"   + ieyasu.getLastName() );
      System.out.println("hidetadaの役職は" + hidetada.getPost() );
      System.out.println("hidetadaの姓は"   + hidetada.getLastName() );
      System.out.println("iemitsuの役職は" + iemitsu.getPost() );
      System.out.println("iemitsuの姓は"   + iemitsu.getLastName() );
   }
}

class Shogun{
   String post = "征夷大将軍";
   public String getPost(){ return( post ); }
}

class Tokugawa extends Shogun{
   String lastName = "徳川";
   public String getLastName(){ return( lastName ); }
}

class Ieyasu extends Tokugawa{ /*特化した内容はここで宣言する*/ }
class Hidetada extends Tokugawa{ /*特化した内容はここで宣言する*/ }
class Iemitsu extends Tokugawa{ /*特化した内容はここで宣言する*/ }

>javac Test.java

>java Test
ieyasuの役職は征夷大将軍
ieyasuの姓は徳川
hidetadaの役職は征夷大将軍
hidetadaの姓は徳川
iemitsuの役職は征夷大将軍
iemitsuの姓は徳川

Tokugawa クラスをスーパークラスに指定しメンバを継承することで、 Ieyasu, Hidetada, Iemitsu の3つのクラスは姓は徳川であり、 役職は征夷大将軍であるという共通した性質を持つことになります。
このように、スーパークラスに共通した性質をまとめてサブクラスに共通した性質を持たせることができるのです。

今までは extends節を使用して明示的にスーパークラスを指定することで継承を行ってきました。
しかし、extends節で明示的にスーパークラスを指定しない場合、Javaでは暗黙的に「extends Object」が付加されています。
つまり extends節を使用しない場合、自動的に Object がスーパークラスに指定され、Object クラスのメンバが継承 されるのです。

例えばコード1は次のように記述しても同じになります。

//コード1( extends Objectを付加 )
class Test extends Object{
   public static void main( String argv[] ){
      Shogun shogun = new Shogun();
      System.out.println( "shogunの役職は" + shogun.getPost() );
   }
}

class Shogun extends Object{
   String post = "征夷大将軍";
   public String getPost(){
      return( post );
   }
}

このため、Javaでは継承関係を遡っていくと必ず最後は Object クラスに行き着きます。
逆に言うと全てのクラスは Object クラスのメンバを継承しているのです。
したがって、Objectで宣言されているメンバには全てのクラスからアクセスすることができます。
例えば Object クラスでは、以下のようなメソッドが定義されています。

public String toString() 

本当にアクセスできるのか試してみましょう。

//コード7
class Test{
   public static void main( String argv[] ){
      Shogun shogun = new Shogun();
      System.out.println( "shogunの文字列表現:" + shogun.toString() );
   }
}

class Shogun{} 
>javac Test.java

>java Test
shogunの文字列表現:Shogun@131f71a

このように、全てのクラスはObjectクラスのメンバを継承しています。
Objectクラスには他にもいくつかメソッドが定義されているので、 気になる人は直接ソースコードを見るか、APIを参照して下さい。



SJC-P対策問題集

Java認定試験( SJC-P/310-035 )対策のメルマガ問題集も好評発刊中! もちろん無料です。
またバックナンバーも見やすくしてオンライン問題集として随時アップしていきます。
受験しない人でも Java の基礎知識を学習するのに最適です。

SJC-P対策参考書

現在、Java認定試験(SJC-P/310-035)対策の参考書は本当にたくさん出版されてます。
ここでは、その中から厳選した本当に役立つ参考書を紹介します。
無駄な出費を抑えるためにも、ぜひ参考にして下さい。

SJC-P対策Java用語集

Java認定試験( SJC-P/310-035 )合格のために必要な Java の用語を集めました。
試験対策にはもちろん、試験以外で Java を学習する際にもご活用下さい。

更新履歴

このサイトの最新情報はここで確認できます。
また、今までこのサイトがどのような軌跡を辿ってきたのかも知ることができます。

Javaを始める人へ

これからJavaを始めようとしているあなたへ。
Javaの勉強を始めるにはどうしたら良いのかを説明しています。
また、初心者に役立つ情報を提供していきます。

Java認定資格の概要

Java認定資格にはどのようなものがあるのか。
資格取得のためにはどのような知識が必要なのか。
その他、資格を取得することのメリットなど、Java認定資格の概要を説明します。

LINK

Javaの勉強に役立つリンク。
その他のプログラミングに関するリンク。
ソフトウェアに関するリンクなど、管理人の主観で集めたリンク集です。
相互リンクも常時募集中!
詳細は以下のページで確認して下さい。

このサイトについて

このサイト「1発合格★Java認定試験!」についての説明です。
サイトで掲載しているソースコードや問題や免責事項などについて説明しています。
初めての人は一度のぞいてみて下さい。

ちょっとひと息

仕事や試験勉強に疲れたら、ここでちょっと一息つきませんか。
一生懸命に打ち込むのも良いけど、たまには何も考えずにゆっくり休むのも良いものです。
たまにはのんびり脳みそをリフレッシュしましょう。

[PR] TV放映で大反響!【エキサイト恋愛結婚】

[PR] ネットでお買い得な通販のことなら、ショッピングNavi
[PR] 韓流・韓国グッズ特集!
[PR] 懐かしの特撮から最新の特撮まで
[PR] ゲームプログラマーになろう
[PR] 仮面ライダー 龍騎 スカイライダー クウガ
[PR] SJC-A対策 SJC-P対策 SJC-WC対策 SJC-D対策
Spring / JSF(JavaServer Faces) / Hibernate / Jbuilder / NetBeans / JUnit / Struts / Strutsリファレンス / ANT / TOMCAT / TOMCAT入門 / [PR] ★アフィリエイト収入アップのためのSEO対策ツール★

Copyright (C) sjc-p.obx21.com. All Rights Reserved.
このサイトはどのページにでも直接リンクして頂いて結構です。リンク大歓迎!
このページのトップページのURLはhttp://sjc-p.obx21.com/です。

Java関連情報
Spring / JSF(JavaServer Faces) / Hibernate / Jbuilder / TOMCAT入門 / NetBeans / JUnit / Struts
Strutsリファレンス / ANT / TOMCAT / JavaでWebサービス / JDBC / JBoss / J2EE / iアプリ
EJB / アプレット / JavaとXML / JMF(Java Media Framework) / Java3D / Jakarta Commons / JNI / OracleとJava
EclipseでJava入門 / Java RMI, CORBA / JSP/サーブレット入門・初心者向け / Javaネットワークプログラミング / WebLogic