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