第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 2026 ExpyDoc