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