第6回独習Javaゼミ 第6章 セクション4~6 発表者 直江 宗紀 6.4 継承とメソッド(1) オーバーロードメソッドとは オーバーライドされると サブクラスにおいて、親となるスーパークラスのメソッ ドと同じ名前のメソッドをサブクラスに作ることにより、 スーパークラスメソッドを隠し、その上にサブクラスの メソッドに置き換えるというもの。 メソッドが呼び出された時、オーバーライドされたメソ ッドが呼ばれてしまう。 スーパークラスメソッドを参照する方法が必要 6.4 継承とメソッド(2) スーパークラスメソッドの参照呼出記述 super.mthName(args) ; mthName:メソッド名,args:引数リスト 利用利点 オーバーライド前のメソッドを利用しつつ、サブクラス 化で新しく追加した機能を使いたい時。 スーパークラスのメソッドを使う場合、別途オブジェク トを作ることなく利用可。 継承とメソッドの関連図 Super.Mth(args) を使うことによって、 本来呼べないスー パークラスのオー バーライドされたメ ソッドにアクセスし、 同様の処理を書く ことなく処理させる ことが可能となる ClsクラスMthメソッドが InheクラスMthメソッドに 「オーバーライド」されている Inheクラス 呼出 Mthメソッド 呼び出し InheクラスのMthメソッドを呼んでも ClsクラスのMthメソッドは呼ばれない Mthメソッド 継承 Clsクラス Mainメソッド 6.5 継承とコンストラクタ(1) クラスの状態と動作 スーパークラスにもクラス定義がある。 サブクラスコンストラクタだけの初期化では不足。 スーパークラスコンストラクタの呼び出し super(args) ; 6.5 継承とコンストラクタ(2) 同一クラスのコンストラクタの呼び出し this(args) ; 上記の呼び出しや、スーパークラスコンストラク タの呼び出しを明示的に使い分け、動作を指定 する使い方が可能。 (ただし、コンパイラではどちらも使われない場合、 オートで「super(args)」が呼び出される) 6.6 クラスの修飾子(1) Classキーワードの前に指定可能修飾子 abstract インスタンス化できないクラス final 拡張不可クラス public 他の全てから参照可クラス (指定無しの場合、同パッケージからでしかクラス参照不可) 3つの修飾子はオブジェクト指向プログラミング において、重要な意味を持つ。 6.6 クラスの修飾子(2) abstractクラス そのクラスは抽象クラスであることを指す。 1つ又は複数のサブクラスによって実装される機 能を宣言する役割を持つ。 「機能の宣言」のため基本的には「中身を持たない」 (インスタンス化可能な抽象クラスを有形クラスという) abstractクラスを「容器」に例えるなら、そのサブクラ スは「中身」に相当する abstractクラスとそのサブクラスの関係 メソッド1 メソッド1 継承 メソッド2 メソッド2 メソッド3 メソッド3 abstractクラス 継承 abstractクラスのサブクラス1 メソッド1 内容は違う メソッド2 メソッド3 abstractクラスのサブクラス2 クラス内の構成 は同じだが、各 メソッドの中身 は異なる 6.6 クラスの修飾子(3) finalクラス そのクラスの実装したメソッドをオーバーライド不 可にする役割を持つ。 publicクラス アプリケーション内のどのクラスからもアクセス 可能であるクラスとする。 (指定が無ければ同パッケージ内でしかやり取り できない) 6.6 クラスの修飾子(4) 「パッケージ」とは… クラス、インターフェイスの集合 既定のパッケージは1ファイルに記述されたクラス、 インターフェイスの集合 次章である7章で詳しく解説される 演習問題 1. 2. リスト6に示すMatrixクラスを元に行列を扱う2 次元配列のインスタンス変数を増やし、用意で きた2つの行列の加算を行うことが出来るよう にしたい。継承を行い、結果を示すプログラム を作成せよ。尚、扱うデータは任意の値とする。 抽象クラス「Language」があるとし、英語、中国 語、フランス語、日本語について、各言語が母 国語である国名について出力されるようなプロ グラムを作成せよ。 サンプルプログラム リスト1 class Cls{ void Mth(int a){ System.out.println("ClsクラスMthメソッド..."+a) ; } } class Inhe extends Cls{ void Mth(int a){ super.Mth(a) ; System.out.println("inheクラスMthメソッド..."+a) ; } } public class InheritansClass{ static public void main(String args[]){ int a=32 ; Inhe in=new in() ; in.Mth(a) ; } } [出力結果] ClsクラスMthメソッド...32 inheクラスMthメソッド...32 サンプルプログラム リスト2 class Cls{ void Mth(int a){ System.out.println("ClsクラスMthメソッド..."+a) ; } } class Inhe extends Cls{ void Mth(int a){ System.out.println("inheクラスMthメソッド..."+a) ; } } public class InheritansClass{ static public void main(String args[]){ int a=32 ; Cls cls=new cls() ; cls.Mth(a) ; Inhe in=new in() ; in.Mth(a) ; } } [出力結果] ClsクラスMthメソッド...32 inheクラスMthメソッド...32 サンプルプログラム リスト3(page1) class Super_cls{ int s_c ; Super_cls(){ System.out.println("Super_clsクラスコンストラクタ...") ; this.s_c=1 ; } } class Inherit_cls extends Super_cls{ int in_1 ; Inherit_cls(){ System.out.println("Inherit_clsクラスコンストラクタ...") ; this.in_1=2 ; } } class Inherit_cls_2 extends Inherit_cls{ int in_2 ; Inherit_cls_2(){ System.out.println("Inherit_cls_2クラスコンストラクタ...") ; this.in_2=3 ; } } サンプルプログラム リスト3(page2) public class InheritanceTest{ static public void main(String args[]){ Inherit_cls_2 in_c_2=new Inherit_cls_2() ; System.out.println("Super_clsで定義のインスタンス変数s_c ..."+in_c_2.s_c) ; System.out.println("Inherit_clsで定義のインスタンス変数in_1 ..."+in_c_2.in_1) ; System.out.println("Inherit_cls_2で定義のインスタンス変数in_2..."+in_c_2.in_2) ; } } [出力結果] Super_clsクラスコンストラクタ... Inherit_clsクラスコンストラクタ... Inherit_cls_2クラスコンストラクタ... Super_clsで定義のインスタンス変数s_c ...1 Inherit_clsで定義のインスタンス変数in_1 ...2 Inherit_cls_2で定義のインスタンス変数in_2...3 サンプルプログラム リスト4(page1) class Super_cls{ int s_c ; Super_cls(int a){ this.s_c=a ; } } class Inherit_cls extends Super_cls{ int in_1 ; Inherit_cls(int a,int b){ super(a) ; this.in_1=b ; } } class Inherit_cls_2 extends Inherit_cls{ int in_2 ; Inherit_cls_2(int a,int b,int c){ super(a,b) ; this.in_2=c ; } } サンプルプログラム リスト4(page2) public class InheritanceTest{ static public void main(String args[]){ Inherit_cls_2 in_c_2=new Inherit_cls_2(1,2,3) ; System.out.println("Super_clsで定義のインスタンス変数s_c ..."+in_c_2.s_c) ; System.out.println("Inherit_clsで定義のインスタンス変数in_1 ..."+in_c_2.in_1) ; System.out.println("Inherit_cls_2で定義のインスタンス変数in_2..."+in_c_2.in_2) ; } } [出力結果] Super_clsで定義のインスタンス変数s_c ...1 Inherit_clsで定義のインスタンス変数in_1 ...2 Inherit_cls_2で定義のインスタンス変数in_2...3 サンプルプログラム リスト5 public class AbstractClass{ //抽象クラス Figure static public void main(String args[]){ abstract class Figure{ Figure f=new Circle() ; void display(){ f.display() ; } } //抽象クラスのサブクラス class Circle extends Figure{ //同士で中身を入れ替えられる void display(){ f=new Triangle() ; System.out.println("Circle") ; f.display() ; } } } } class Triangle extends Figure{ void display(){ [出力結果] System.out.println("Triangle") ; Circle } Triangle } サンプルプログラム リスト6 class Matrix{ int matrix[][],dimension ; Matrix(int number){ this.dimension=number ; this.matrix=new int[this.dimension][this.dimension] ; for(int i=0;i<this.dimension;i++){ for(int j=0;j<this.dimension;j++){ this.matrix[i][j]=1 ; } } } void Input_matrix(int row,int line,int number){ this.matrix[row][line]=number ; } }
© Copyright 2024 ExpyDoc