[102]
[103]
5.1.4 static メソッドと instance メソッド (1) static メソッド
・メソッドを作成するとき「static」指定をすると,そのメソッドは static メソッ ドとなる。
・static メソッドはクラスに 1 つしか存在しないクラス固有のメソッドであり,オ ブジェクトを生成せず「クラス名.メソッド名(実引数) ; 」の形で呼び出して実 行する。
(2) instance メソッド
・クラスからオブジェクトを生成すると,そのオブジェクトにはクラスのメソッド も作られる。これを instance メソッドという。
・instance メソッドは「オブジェクト名.メソッド名(実引数) ; 」の形で呼び出し て実行する。
5.1.5 ユーザーメソッドの書式
修飾語 戻り値の型 メソッド名(仮引数) {
メソッド本体
}
(1)修飾語
「public」または「private」を指定する。「static」指定も可能である。
(2)戻り値の型
・メソッドが呼び出し側に戻す値のデータ型(基本データ型,配列型,クラス型,
等々)を指定する。
・戻り値の要らない場合には「void」と指定する。
(3)メソッド名
メソッド名の付け方は変数名のそれと同じであり,当該メソッドがどのような役 割を果たすのかがわかるような名前をつけた方がいい。
(4)仮引数
・呼び出し側からメソッドに渡されるデータを受け取る変数であり,0 個以上を 定義する。
[104]
・複数個を定義する場合には各仮引数をカンマで区切る。
・仮引数はメソッドの中だけで有効であり,メソッドの終了と同時に消滅する。
5.1.6 Math クラスのメソッド
メソッド 機 能
Math.abs(x) x の絶対値
Math.ceil(x) x より大きい最小の整数値(小数点以下切り上げ) Math.floor(x) x より小さい最大の整数値(小数点以下切り捨て) Math.exp(x) x の指数関数値(ex)
Math.log(x) x の自然対数値 Math.max(x, y) x と y のうち大きい値 Math.min(x, y) x と y のうち小さい値 Math.pow(x, y) x の y 乗
Math.sqrt(x) x の平方根
・static メソッドであるので,「Math.メソッド名(実引数) ; 」として呼び出す。
・Math.PI(円周率 3.14159…),Math.E(自然対数の底 2.71828…)
[main メソッドの中からユーザーメソッドを呼び出す場合]
・・・・・・・・・・・・・
double menseki, pai=3.14 ; int hankei=10 ;
menseki=myMethod(hankei, pai) ; //① ・・・・・・・・・・・・・
} //main メソッドの終わり
public double myMethod( int r, double p) { //② double menseki ;
menseki=r*r*p ;
return menseki ; //③ } //The end of myMethod( )
[105]
① menseki=myMethod(hankei, pai) ;
変数「hankei」の値と変数「pai」の値を実引数としてユーザーメソッド「myMethod」
を呼び出す。ここの変数「menseki」はグローバル変数である。
② public double myMethod(int r, double p) {
実数値の戻り値と 2 つの仮引数(整数値 1 つと実数値 1 つ)を持つユーザーメソ ッド「myMethod」を定義する。
③ return menseki ;
ユーザーメソッド「myMethod」の中で計算した変数「menseki」の値をメソッド の呼び出し側に戻す。ここの変数「menseki」はローカル変数である。
[ユーザーメソッド]
//3 つの数値の中から最大値を見つけ出すメソッド import java.awt.* ;
import java.awt.event.* ; import java.applet.* ;
//<applet code=um.class width=700 height=500></applet>
public class um extends Applet { Font font;
int num1=12, num2=34, num3=56, max ;
public void init( ){
font=new Font("TimesNewRoman", Font.PLAIN, 24);
setFont(font);
}//The end of init( )
public void paint(Graphics g) {
max=maxMethod(num1, num2, num3) ; //①
g.drawString("["+num1+","+num2+","+num3+"]→最大値="+max, 30, 50) ; }//The end of paint( )
[106]
public int maxMethod(int x, int y, int z) { //② int max=Math.max(x, Math.max(y, z)) ; //③
return max ;
} //The end of maxMethod( ) } //The end of um.java
① max=maxMethod(num1, num2, num3) ;
ユーザーメソッド「maxMethod」を呼び出し,3 つの実引数(整数値)を与える。
ユーザーメソッド「maxMethod」からの戻り値を整数変数「max」に代入する。
ここの整数変数「max」は paint メソッドの中だけで用いることのできるローカ ル変数である。
② public int maxMethod(int x, int y, int z) {
整数値の戻り値と 3 つの仮引数(整数変数)を持つユーザーメソッド「maxMethod」
を定義する。
③ int max=Math.max(x, Math.max(y, z)) ;
Java の組み込みメソッド「Math.max」を用いて 3 つの仮引数の中から最大値を 見つけ,それを整数変数「max」に代入する。ここの整数変数「max」はユーザー メソッド「maxMethod」の中だけで用いることのできるローカル変数である。
[問題 1]
2 つの正整数(x, y)を受け取りその最大公約数(greatest common divisor)と最小公 倍数(least common multiple)を求めるメソッドを組み込んだ Java applet を作成せよ。
整数 1 (x) 12 整数 2 (y) 18
(12, 18)の最大公約数(GCD) : 6 (12, 18)の最小公倍数(LCM) : 36
[107]
[問題 2]
分数の加算
L K J
I を行い,その結果を分数
N
M で表示する Java applet を作
成せよ。
[4 行 4 列の配列]
列 行
0 列 1 列 2 列 3 列
国語 英語 数学 学生平均
0 行 学生 1 57 35 76 0
1 行 学生 2 45 78 63 0
2 行 学生 3 92 72 67 0
3 行 科目平均 0 0 0 0
[2 次元配列]
//2 次元配列 import java.awt.* ; import java.awt.event.* ; import java.applet.* ;
//<applet code=doubleArray.class width=700 height=700></applet>
public class doubleArray extends Applet{
Font font ;
// 科目 1, 科目 2, 科目 3, 学生平均
int score[ ][ ]={{ 57, 35, 76, 0 }, //学生1 { 45, 78, 63, 0 }, //学生2 { 92, 72, 67, 0 }, //学生3 { 0, 0, 0, 0} }; //科目平均 int xPos, yPos, high=0, low=100, sum=0; ;
int i, j, k, subjects, students ;
[108]
public void init( ){
font=new Font("TimesNewRoman", Font.PLAIN, 24) ; setFont(font) ;
students=score.length-1 ; //① subjects=score[0].length-1 ; //② }//The end of init( )
public void paint(Graphics g){
displayArray(g) ; }//The end of paint( )
//配列値を表示するメソッド
public void displayArray(Graphics g){
xPos=120 ; yPos=50 ; for(i=0; i<subjects+1; i++){
k=i+1;
if(i == subjects) g.drawString("学生平均", xPos, yPos) ; else g.drawString("科目["+k+"]", xPos, yPos) ;
xPos+=100 ; }
for(i=0; i<students+1; i++){
xPos=25 ; yPos+=35 ; k=i+1;
if(i == students) g.drawString("科目平均", xPos, yPos) ; else g.drawString("学生["+k+"]", xPos, yPos);
xPos=150 ;
for(j=0; j<subjects+1; j++){
g.drawString(""+score[i][j], xPos, yPos) ; xPos+=100 ;
} }
}//The end of dispalyArray( ) }//The end of doubleArray.java
[109]
[問題 3] 上記の Java applet(doubleArray.java)に次の機能を追加せよ。
(1)各学生の点数の平均値を求めるメソッドを追加し,それを利用することに よって各学生の 3 科目の点数の平均値を求めて表示する。
(2)各科目の点数の平均値を求めるメソッドを追加し,それを利用することに よって各科目の 3 学生の点数の平均値を求めて表示する。
(3)「学生別の 3 科目の点数」と「科目別の 3 学生の点数」を棒グラフで表示 する。
5.2 クラス(class)とオブジェクト(object) 5.2.1 クラス
・クラスは「変数」と「メソッド」によって構成され,1 つのプログラムの中に複 数のクラスを書き入れることができる。
・クラスの書式
[修飾子] class クラス名 {
変数とメソッドの定義
}
5.2.2 オブジェクト
・クラスを元にして作ったものであり,クラスと全く同じ中身をもつ。
したがって,クラスをオリジナル品とすれば,オブジェクトはその複製品である。
・オブジェクトの生成
クラス名 オブジェクト名=new クラス名( ) ;
・オブジェクトへのアクセス オブジェクト名.変数名 ;
オブジェクト名.メソッド名(実引数) ;
[110]
・カプセル化とデータ隠蔽
メソッドを用いて変数の内容を変更することをカプセル化といい,カプセル化に よって変数の内容を外部から変更できないように完全に遮断したオブジェクト を作ることをデータ隠蔽という。
[複数のクラスを持つ Java application]
class class1 {
public static void main(String[ ] args) { class1 objt=new class1( ) ; //①
System.out.println("main method") ; objt.myMethod1( ) ; //②
} //The end of main( ) void myMethod1( ) {
class2 objt=new class2( ) ; //③ System.out.println("myMethod1") ; objt.myMethod2( ) ; //④
} //The end of myMethod1( ) } //The end of class1
class class2 {
void myMethod2( ) {
System.out.println("myMethod2") ; } //The end of myMethod2( )
} //The end of class2
① class1 objt=new class1( ) ;
クラス「class1」のオブジェクト「objt」を生成する。
② objt.myMethod1( ) ;
クラス「class1」のオブジェクト「objt」の中のユーザーメソッド「myMethod1」
を呼び出して実行する。
③ class2 objt=new class2( ) ;
「クラス class2」のオブジェクト「objt」を生成する。
[111]
④ objt.myMethod2( ) ;
クラス「class2」のオブジェクト「objt」の中のユーザーメソッド「myMethod2」
を呼び出して実行する。
5.2.3 オーバーロード(overload)
・同名のメソッドを複数定義すること
・オーバーロードされたメソッドの引数は,引数の「型,台数,並び方」のいずれ かが異なる必要がある。
[メソッドのオーバーロード]
class class3 {
public static void main(String[ ] args) { overloadClass objt=new overloadClass( ) ; //①
objt.myMethod(999) ; //②
objt.myMethod("東京国際大学") ; //③ } //The end of main( )
} //The end of class3
class overloadClass {
void myMethod(int k) { //④
System.out.println("引数"+k+"は整数です。") ; } //The end of myMethod(int k)
void myMethod(String str) { //⑤
System.out.println("引数"+str+"は文字列です。") ; } //The end of myMethod(String str)
} //The end of overloadClass
① overloadClass objt=new overloadClass( ) ;
クラス「overloadClass」のオブジェクト「objt」を生成する。
② objt.myMethod(999) ;
➂objt.myMethod("東京国際大学") ;
[112]
ク ラ ス 「 overloadClass 」 の オ ブジ ェ クト 「 objt 」 の 中の ユ ー ザー メソ ッ ド
「myMethod」を呼び出して実行する。呼び出されるメソッドは引数の型によっ て異なる。
④ void myMethod(int k) {
⑤ void myMethod(String str) {
ユーザーメソッド「myMethod」をオーバーロード定義する。
5.2.4 クラスの継承
・継承の仕組みを用いると,作成済の親クラスの機能をそのまま子クラスで利用す ることができる。継承は予約語「extends」により実現する。
・継承の書式
class 子クラス名 extends 親クラス名 {
変数およびメソッド
}
[クラスの継承]
class class4 {
public static void main(String[ ] args) { subClass objt=new subClass( ) ; System.out.println("main method") ;
objt.subMethod( ) ; //① objt.superMethod( ) ; //② } //The end of main( )
} //The end of class4
class superClass {
void superMethod( ) {
System.out.println("親クラス") ; } //The end of superMethod( )
[113]
} //The end of superClass
class subClass extends superClass { //③ void subMethod( ) {
System.out.println("子クラス") ; } //The end of subMethod( )
} //The end of subClass
① objt.subMethod( ) ;
② objt.superMethod( ) ;
クラス「subClass」のオブジェクト「objt」の中のユーザーメソッド「subMethod」
と「superMethod」を呼び出して実行する。
③ class subClass extends superClass {
クラス「superClass」の機能を継承するクラス「subClass」を定義する。
5.2.5 インタフェース(interface)
・引数が決まっているだけで,実際の処理を記述しないクラス
・インタフェースの定義
interface インタフェース名 {
定数およびメソッド
}
・クラスと異なる点
①宣言のキーワードは「interface」
②定数を書くことはできるが,変数を定義することはできない。
③メソッドの形式を記述することはできるが,メソッドの処理を記述する ことはできない。
④インタフェースのオブジェクトを生成することはできない。
[114]
・インタフェースの参照
class クラス名 implements インタフェース名 {
変数およびメソッド
}
5.3 例外処理
5.3.1 エラー(error)と例外(exception)
・Java 文法上の過ちをエラーといい,実行時の過ちを例外という。
・例外の種類と原因
例外の種類 原 因
Exception 例外のうち,プログラムで復旧可能なすべての
例外
RuntimeException 例外のうち,例外処理が不要なすべての例外
IOException 入出力における例外
ArithmeticException 分母がゼロの除算などの不正演算 ArrayindexOutOfBoundsException 存在しない配列要素の呼び出し FileNotFoundException 存在しないファイルの呼び出し
[115]
5.3.2 例外処理の仕組み
try { try ブロック
・・・・・・・ 発生可能な例外を記述するブロック } catch(例外の型名 変数名) { catch ブロック
・・・・・・・ スローされた例外をキャッチし,処理 } catch(例外の型名 変数名) { するブロック
・・・・・・・
} finally { finally ブロック
・・・・・・・ 例外の発生如何に関わらず,必ず実行 } されるブロック
[例外処理]
class exceptionExample {
public static void main(String[ ] args) { int i ;
int a[ ]=new int[5] ; //① try{
for(i=0; i<6; i++) { //② a[i]=99 ;
System.out.println(" "+a[i]) ; } //The end of for( )
} catch(ArrayIndexOutOfBoundsException e) { //③ System.out.println(" 例外発生! ") ;
System.out.println("存在しない配列要素を指定している。") ; return ;
} finally {
System.out.println("finally ブロックを実行") ; } //The end of try-catch block
} //The end of main( )
} //The end of exceptionExample.java
[116]
① int a[ ]=new int[5] ;
5 つの要素数をもつ整数配列「a」を生成する。
② for(i=0; i<6; i++) {
変数「i」の値を 0 から 5 まで 1 ずつ増やしながら 6 回繰り返す。
③ } catch(ArrayIndexOutOfBoundsException e) {
配列の指定要素数を超えたインデックスを指定したときに発生する例外を処理 する catch ブロック
* このプログラムでは,配列「a」の要素として a[0]から a[4]までの 5 つの要素し か生成されていないのに,存在しない配列要素 a[5]を繰り返しブロックの中で指 定するようになっているので,配列要素数の逸脱が起こり catch ブロックが実行 され例外を処理する。
[117]
5.4 GUI(Graphical User Interface)とイベント処理 5.4.1 GUI
・マウスなどを使って画面表示を操作するユーザーインタフェース
・GUI パッケージ
基本的な画面表示の操作には「AWT(Abstract Window Toolkit)パッケージ」が使 われ,高度な画面表示の操作には「Swing パッケージ」が使われる。
・オブジェクト表示位置の指定
setLayout(null) : 標準レイアウト(flowLayout)を解除する。
setBounds( x, y,幅, 高さ) :
オブジェクトの表示位置(オブジェクトの左上角の x 座標値と y 座標値)と 大きさ(オブジェクトの幅と高さ)をピクセル単位で指定する。
左上角の x 座標値
左上角の y 座標値 幅
オブジェクト 高さ
5.4.2 イベント処理
・マウスクリックやキー打鍵などで生じるコンポーネントの状態の変化(イベント の発生)に応じて行う処理
・AWT に属するコンポーネントによって発生させられるイベントはすべて
「java.awt.Event」クラスのサブクラスである。
・イベント関連用語
EO (Event Object) : イベントが発生するオブジェクト
EL (Event Listener):イベントの発生を感知するコンポーネント LI (Listener Interface) : イベント関連インタフェース
・EO とそれに対応する LI
Button オブジェクト , TextField オブジェクト → ActionListener Checkbox オブジェクト, Choice オブジェクト → ItemListener Mouse オブジェクト → MouseLisneter, MouseMotionListener