独習Java

独習Java
6.4継承とメソッド
6.5継承とコンストラクタ
11月28日
時田 陽一
6.4 継承とメソッド
オーバーライドされたメソッド・・・スーパークラスのメソッドを隠す
スーパークラスで定義された元のメソッドを使う場合どうすればよい??
スーパークラスのメソッドの参照:super.mthName ( args )
mthName : スーパークラスのメソッド名
args : 省略可能な引数の並び
サブクラスからスーパークラスの機能にアクセス
・・・ サブクラスの処理を完了する前か後で、
スーパークラスのメソッドを呼び出す必要がある
コードを効率的に再利用できる
プログラム例[1]
class I1 {
void hello(String s){
System.out.println("I1: " + s);
}
}
class J1 extends I1 {
void hello(String s){
super.hello(s);
System.out.println("J1: " + s);
}
}
継承関係にある3つのクラスを宣言
helloメソッドによりユーザへの挨拶を表示する
J1クラスはI1ク
ラスを拡張
スーパークラスの
メソッドの参照
class SuperForM1{
public static void main(String args[]){
System.out.println("Instantiating I1");
I1 obj = new I1();
obj.hello("Good morning");
System.out.println("Instantiating J1");
obj = new J1();
obj.hello("Good afternoon");
}
}
出力結果:
Instantiating I1
I1: Good morning
Instantiating J1
I1: Good afternoon
J1: Good afternoon
6.5 継承とコンストラクタ
クラスの状態と動作・・・そのクラスだけでなく、スーパークラスにも定義
オブジェクトを適切に初期化するには、
スーパークラスのコンストラクタも実行しなければならない
スーパークラスのコンストラクタの呼び出し:super( args );
args : 省略可能な引数のリスト
コンパイラが並びをチェックし、スーパークラスのどのコンストラクタ
を呼び出すのかを判断
this( args );・・・同一クラスのコンストラクタの呼び出し(前章)
コンストラクタの最初のステートメントでなければならない
コンストラクタの最初のステートメントでなければならない
⇒ super()とthis()の両方を使うことはできない
※どちらも使わず、別のコンストラクタを明示的に呼び出さないときはコンパイラに
よりsuper()が呼び出される
プログラム例[2]
継承階層でsuper()を明示的に使っているプログラムの例
class S2 {
・T2クラスはS2クラスを拡張
int s2;
・T2のコンストラクタは、2つの引数を受け取り、
S2(int s2) {
this.s2 = s2;
super()を呼び出しS2のコンストラクタを呼び出す。
}
出力結果:
}
class T2 extends S2 {
t2.s2 = 1
int t2;
t2.t2 = 2
T2(int s2, int t2) {
super(s2);
引数s2をS2のコンストラクタへ渡す
this.t2 = t2;
}
}
class InheritanceAndConst2 {
public static void main(String args[]) {
T2クラスをインスタンス化
T2 t2 = new T2(1, 2);
System.out.println(“t2.s2 = “ + u2.s2);
System.out.println(“t2.t2 = “ + u2.t2);
}
}
課題
●(x,y)座標を持つ2つの点の間の距離を求めるプログラムを
作成しなさい。
条件
・座標の値はあらかじめメソッド内で定義しておいてかまわない。
・各点ごとにある形式のクラスのオブジェクトを作成し、それを距離計算
用のメソッドへ送り計算させること。
・x座標とy座標それぞれのコンストラクタを作成すること(p187,例
6.5‐2参照)。