第6回独習Javaゼミ

第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 ;
}
}