継承: スーパークラスとサブクラス

書籍を表すBookクラスを継承して、漫画本(巻という概念がある)を表すクラスを作ろう。

ソースコード

mainメソッドで、それぞれ使ってみよう。

実行結果:

Javaの絵本, アンク, 1580円
ドラえもん, 藤子不二雄, 500円

Comicのコンストラクタ

  • 継承したクラス(サブクラス)のコンストラクタでは、スーパークラスのコンストラクタを最初に呼ばなければならない。
  • スーパークラスのコンストラクタはsuper(引数)で呼ぶことができる。
  • スーパークラスに引数なしのコンストラクタ(デフォルトコンストラクタを含む)がある場合、「super();」という記述を省略することができる(つまり書かなくても呼ばれる)。

オーバーライド

  • スーパークラスと同じメソッドを定義するとそのメソッドを上書きすることができる。
  • スーパークラスのメソッドは super.メソッド名(引数)で呼び出すことができる。
  • @Overrideはなくてもいいが、つけておくとオーバーライドできているかチェックしてくれる(アノテーション)。

実行結果:

Javaの絵本, アンク, 1580円
ドラえもん, 藤子不二雄, 500円, 1巻

合計金額を計算する(1)

代入記号の意味

プリミティブ型(基本型)は「箱」のイメージ。代入によって、値がコピーされて箱に格納される。

Assignment1

クラス型(参照型)は「タグ」のイメージ。
代入によって、同じインスタンスに結びつく。

Assignment2

もっと色々知りたい人のために:

  • タグが1つも付いていないインスタンスはどうなるのか?→GC(ガベージコレクション、ゴミ集め)によってメモリから消えて無くなる。[教科書P.82]
  • Null Pointer(ヌルポ)とは、タグの先にインスタンスがない状態のこと。
  • クラス型のインスタンスをコピーするのはどうするのか?→自分で実装する。大抵はcloneメソッドをオーバーライドする。
  • インスタンスをコピーするコードを書いたけど、思った通りにコピーされてない。→シャローコピー(shallow copy)とディープコピー(deep copy)について調べよう。

サブクラスのインスタンスをスーパークラスのインスタンスとして扱う

Comicクラスのインスタンスは、Bookクラスのインスタンスとして扱うことができる。なぜならComicクラスはBookクラスを受け継いでいるから(継承しているから)。

多態性[教科書P.108]

  • comic2で呼び出すときは、Comicとして扱うので、volumeフィールドにアクセスできる。
  • book2で呼び出すときは、Bookとして扱うので、volumeフィールドにアクセスできない。
  • book2.getInfo()は上書きした方(ComicのgetInfo)が呼び出される(Bookとして扱う場合であっても、実体はComicクラスのインスタンスだから)。

合計金額を計算する(2)