初心者のJavaプログラミング

プログラミングガチ初心者がIT業界を目指して頑張ります。

【第19回】初心者のJavaプログラミング【継承】

こんばんは。
かなり時間が空いてしまいました。
なかなか書く時間がなかったです、すみません。

今回はクラスの継承についてです。
継承とはなんぞやからやって行きます。

継承

オブジェクト指向を勉強していると継承という概念が出てくると思います。
今まで継承の使い方(コードの書き方)は知っていたんですが、そんなに便利なもんなの?
と思っていました。
最近その辺が分かってきたというか、あーこれがオブジェクト指向か〜と思うようになってきたので、書き方というよりは、
継承そのものについて書いていく予定です。

いきなり例をだします。今学校に通っているので、学校の例を。
学校でテストってありますよね。その管理をするシステムを考えます。
システムを作るにあたって、考えられるクラスは「生徒クラス」、「先生クラス」が考えられます。

じゃあまず生徒クラスの属性、機能を考えていきたいところですが、
今回は簡単に属性だけを考えていくことにします。

考えられる属性としては、

  • 生年月日
  • 名前
  • 出身
  • 所属組

でしょうか。ここらへんは適当ですw

次に、先生クラスを考えていきます。

  • 生年月日
  • 名前
  • 出身
  • 担当科目

でしょうか。ここも適当ですw

類似点から抽象的なものを探す

気付いた方も多いと思いますが、この2つのクラスの属性って、ほぼおなじですよねw
生年月日、名前、出身が共通の属性になります。
すぐに、「これをひとまとめにすればいいんだ!」
という風に考えるのは、やや危険な気がします。
こういうときは、なぜ共通の属性がでてくるんだろう?
と考えます。
なぜなぜ作戦ですね。
すぐ解決方法を考えるのは良くないと思います。
ん〜なんで共通の属性がでてくるんだろう。これは難しく考えすぎるとドツボにはまります。
簡単に考えます。生徒、先生はともに人です。
ばかばかしいかもしれませんが、この考え方が大事です。この場合人または人物がクラスになります。
複数のクラスから類似点を探し出します。このとき探し出したものは抽象的なものになることが多いです。
だから結構探し出すのは難しいです。
犬、猫、ゴリラ。
共通点はほ乳類とかになりますね。
人物もほ乳類もあまり具体的にイメージすることができないですよね。

で、抽象的な人物という共通項が見つかりましたね。
これをどうするかというと、独立したクラスとして扱います。
このような仕組みを継承(汎化としての継承)といいます。

あるクラスが、別のクラスの性質をそのまま引き継ぎます。
この例だと、
生徒クラスが人物クラスの性質を引き継いでいる。
先生クラスが人物クラスの性質を引き継いでいる。
この関係が継承です。

こんなイメージです。
f:id:fightingneetkun:20140821234635p:plain
人物クラスの性質を引き継ぐので、生徒、先生クラスには書かれていませんが、
実際には生年月日、名前、出身の属性を持ってます。
この時の人物クラスをスーパークラス、生徒、先生クラスをサブクラスと言います。
これは相対的なものです。
また、複数スーパークラスを継承すること(多重継承)はJavaは許してません。
C++は許しているみたいです。

最後にこの例をJavaで書くとこのようになります。

class 人物 {
  生年月日;
  名前;
  出身;
}

class 生徒 extends 人物 {
  所属組;
}

class 先生 extends 人物 {
  担当科目;
}

多分考え方が分かっていれば、extendsが継承を表すものなんだなーと分かると思います。

ちょっと眠くなってきてしまったので、続きは次回ですw