図Proo4_1_㏛cは「クラスの継承 Override, superの使い方」を説明するためのプログラム例である。このプログラムの最後にコメントで実行結果が示されている。このプログラムにはBook、ProBook、Proo4_1のクラスがある。Bookが親クラス(スーパークラス)でそれがProBook(子クラスまたはサブクラス)に継承されている。継承するには10行のようにextendsを使て親クラス名を書く。条件(後に学習)にもよるが、コンストラクタ以外は殆ど全て継承される。ProBookクラスは親のフィールドとメソッドを継承し、フィールドとしてcategory,コンストラクタとしてProBook,メソッドとしてdisplayを新しく追加している。
21行 a,bをBook型の参照変数としている。
22行 親クラスBookのオブジェクトをaに作っている。
23行 親クラスのメソッドdisplayによりaのtitleとpageを表示している。
24行 子クラスProBookのコンストラクタにより三つの引数でオブジェクトを作成している。そのとき、super(title,page)により親クラスのコンストラクタを使用している。子クラスのコンストラクタから親クラスのコンストラクタを呼ぶ場合、コンストラクターの先頭で呼ばなければならない。オブジェクトが二重にできるわけではない。従って、bは子クラスのコンストラクタによるオブジェクトとなる。
25行 bには継承したメソッドpsetがある。これは継承しただけのメソッドで親クラスのものと同じである。継承したメソッドで継承したフィールドを修正している。
26行 displayは継承した上で、更に追加として、categoryの表示ができるようにしている(15から17行)。display()は親クラスと子クラスの両方に同じ名前で存在する。その場合子クラスのdisplayは継承したメソッドが上書きされている。子クラスではオーバーライド(上書き)したメソッドだけが存在する。16行のsuperで親クラスのdisplayの機能を取り込んでいる。更に、categoryも表示できるようにしている。30,31行はオーバーライドしたメソッドdisplayにより表示されている。
子クラスのオブジェクト参照変数に親クラスのオブジェクトをセットすることはできない。21行のa,bは親クラスの参照変数であるので、どちらのオブジェクトも受けいれることができる。
一般にオブジェクトの機能はどちらのコンストラクタ(親か子か)で作られているかで働きが違ってくる。
以下はソースです。
/*クラスの継承 Override, superの使い方*/ class Book { String title;int page; void display(){System.out.println("title="+title+", page="+page);} void pset(String title, int page){this.title=title;this.page=page;} Book(String title, int page){ this.title=title;this.page=page; } } class ProBook extends Book{ int category; ProBook(String title, int page, int category){ super(title,page);this.category=category; } void display(){ super.display();System.out.println(" category="+category); } } public class Proo4_1{ public static void main(String[] args){ Book a,b; a=new Book("Introduction to Java",500); a.display(); b=new ProBook("Introduction to C",300,1); b.pset("Intoduction to C++",400); b.display(); } } //title=Introduction to Java, page=500 //title=Intoduction to C++, page=400 // category=1