継承とは?
「継承」とは、すでにあるクラスの機能を新しいクラスが引き継ぐことです。
これによって機能の拡張が容易にできるというメリットがあります。
具体的にどのようなものかというと下の図をご参照ください。
例えばすでに作られている「クラスA」があったとします。
この「クラスA」の中に「機能a」と「機能b」というメソッドがあります。
これから新しいクラスを作ろうとします。そのクラスには「クラスA」の中の「機能a」と「機能b」が必要です。そしてそれに加えて「クラスB」の中で独自の「機能x」も必要です。
このような場合すでにできている「クラスA」があるので1から「クラスB」をつくるのではなく「クラスA」の機能を継承して独自の「機能x」を加えれば効率よく「クラスB」をつくることができます。
このような場合継承される側の「クラスA」をスーパークラス(親クラス)といい継承する側、「クラスA」から派生した「クラスB」をサブクラス(子クラス)といいます。
Javaの継承のルール
- あるクラスのスーパークラスは1つのみ
- あるクラスのサブクラスは複数可
- 継承の関係を図にすると樹形図になる
- もっとも上位のクラスはObjectクラス。すべてのクラスがこのクラスを直接的または間接的に継承
Java言語のなかでの話になりますが、最も上位のクラスのことをObjectクラスといいます。このObjectクラスの機能はすぐ下のクラスA・D・Eはもちろん引き継ぎます。そしてさらにそれぞれの子クラスにもその機能を伝えていくことになります。
継承をおこなうための extends
- class A {
- クラスAの内容
- }
- class B extends A {
- 追加する新しいフィールドとメソッド
- }
クラスBがクラスAを継承する場合、クラスBの宣言に「 extends A 」と記述します。
クラスAに記述されている内容は記述する必要はありません。クラスBには新たに追加する機能のみを記述します。
Objectクラスの継承
継承とはすべてのクラスがObjectクラスを継承するので本来は下のように記述します。ただ extends object は省略することができます。
- class A extends object {
- クラスAの内容
- }
- class B extends A {
- 追加する新しいフィールドとメソッド
- }
Javaの継承のルールで説明したようにすべてのクラスがObjectクラスを直接的または間接的に継承します。
なので本来であれば class A はObjectクラスを継承しているので
class A extends object
と記述する必要があります。
ただこれは当たり前のことなので省略することができます。
フィールドとメソッドの継承
フィールドとメソッドの継承のしかたについて説明します。
- class Point {
- int x ;
- int y ;
- void printInfo ( ) {
- system . out . println ( x ) ;
- system . out . println ( y ) ;
- }
- }
printInfo というメソッドが Point クラスに用意されています。
void は戻り値のないメソッドをさします。
( )の中は空なので引数はありません。
- class ColorPoint extends Point {
- String color ;
- }
ColorPoint というクラスを Point クラスの子クラスとして宣言します。
継承関係が発生するので必ず extends Point を記述します。
この子クラスの独自のフィールドは文字列型の color という変数です。
- class ColorPoint cp = new ColorPoint ( ) {
- cp . x = 5 ;
- cp . y = 10 ;
- cp . color = “赤” ;
- }
これが main クラスになります。
まずインスタンス化します。
子クラスである ColorPoint クラスをインスタンス化します。
ColorPoint クラス型の変数 cp に情報の参照を代入します。
インスタンス変数のxに5を代入します。yには10を代入します。
なぜ ColorPoint クラスのxとyの変数は定義されていないのにこれができるのでしょうか。
それは親クラスである Point クラス引き継いでいるからです。
extends Point を記述しないとこの変数の定義時点でエラーとなります。
上の図のように子クラスは親クラスのフィールドとメソッドを共に引き継ぎます。
Point クラスのプログラムコード
- class Point
- int x ;
- int y ;
- void printInfo ( ) {
- System . out . println ( x ) ;
- System . out . println ( y ) ;
- }
- }
- class ColorPoint extends Point {
- String color ;
- }
- class ColorPointExample1 {
- public static void main ( String [] args ) {
- ColorPoint cp = new ColorPoint ( ) {
- cp . x = 5 ;
- cp . y = 10 ;
- cp . color = ” 赤 ” ;
- cp . printInfo ( ) ;
- System . out . println ( cp . color ) ;
- }
- }
解説
- class Point
- int x ;
- int y ;
- void printInfo ( ) {
- System . out . println ( x ) ;
- System . out . println ( y ) ;
- }
- }
- class ColorPoint extends Point {
- String color ;
- }
ここまでがフィールドとメソッドの継承で説明した内容になります。
Point クラスの中身の定義と ColorPoint の継承になります。
- ColorPoint cp = new ColorPoint ( ) {
まずインスタンス化します。
- cp . x = 5 ;
- cp . y = 10 ;
- cp . color = ” 赤 ” ;
- cp . printInfo ( ) ;
- System . out . println ( cp . color ) ;
cp という ColorPoint クラス型のインスタンス変数のなかにそのままアクセスしてxに5、yに10を代入します。
続いて独自の変数に「赤」を代入します。
次に printInfo という親クラスが持っているメソッドを呼び出して実行します。
最後に cp . color 変数の中身を出力します。
うまくコンパイルできれば、まずmainメソッドの中で
- cp . x = 5 ;
- cp . printInfo ( ) ;
- System . out . println ( cp . color ) ;
cp . printInfo ( ) ; が実行され
- void printInfo ( ) {
- System . out . println ( x ) ;
- System . out . println ( y ) ;
- }
xとyの変数の中身が出力されます。
- cp . x = 5 ;
- System . out . println ( cp . color ) ;
最後に cp の color 変数の中身が出力されます。
出力結果は
- 5
- 10
- 赤
となります。
ぜひコードを記述して試してみてください。
参考資料
Java 第2版 入門編 ゼロからはじめるプログラミング【電子書籍】[ 三谷純 ]
Java 第3版 入門編 ゼロからはじめるプログラミング (プログラミング学習シリーズ) [ 三谷 純 ]