[課題]
講義資料オブジェクト指向プログラムJavaIの中のサンプルプログラムのポイ
ントについて考察せよ。
サンプルプログラム
class keisan {
static int tanka; // static変数(+クラス変数)
tankaの宣言
private float rate; // private変数(+クラス変数) rateの宣言
keisan() { // コンストラクタ(引数無し)
tanka = 1000;
rate = 0.05f;
}
int keisan(int kazu) { // コンストラクタ(引数有り)
int kingaku; // ローカル変数kingakuの宣言
kingaku = (int)(tanka * kazu * (1.0 + rate));
return kingaku;
}
// ※(メソッドのオーバーロードも行っている)
}
class PrvSample {
public static void main(String args[]) {
keisan obj1 = new keisan(); // コンストラクタ(引数無し)を使って初期化
int kazu = 3; // ローカル変数kazuの宣言
int kingaku = obj1.keisan(kazu); // コンストラクタ(引数有り)を使って計算
System.out.println("tanka = " + obj1.tanka); // obj1(keisanの中の)tankaを出力
System.out.println("kazu = " + kazu); // mainのkazuを出力
System.out.println("kingaku = " + kingaku); // 同じくkingakuを出力
System.out.println("rate = " + obj1.rate); //private変数のため参照不可
}
}
|
実行結果
tanka = 1000
kazu = 3
kingaku = 3150
|
考察
1.クラスについて
クラスは、データとメソッドを定義したものです。
クラスからは任意の個数のオブジェクトを作成することが出来ます。オブジェク
トを作成することをインスタンス化といいます。
オブジェクトの状態を保持するのがフィールド(メンバー変数、属性、データ)であり、動作・機能を記述したものがメソッドです。
extendsをクラスを定義する時に使う事でスーパークラスを継承し、その中で
定義されているクラスやメソッドを使えるようにする。
またインターフェイスの実行部をクラスに実装し、インターフェイスに定義さ
れているメソッドや定数をつかえるようにすることができる。
[修飾子] class クラス名 [extends スーパークラス名]
[implements インタフェース名]
//フィールド
[修飾子] 型 変数名 = 値;
//メソッド
[修飾子] 戻り値型 メソッド名([メソッド引数]) {
コンピュータ制御
}
}
|
クラスの装飾子には、次の下の種類があります。
クラス修飾子
修飾子 |
説明 |
abstract
|
抽象クラス。継承されることを明示する。このクラスはインスタンス化で
きな
いクラス。サブクラスで実装してはじめてインスタンス化できる。
|
final
|
継承されたくないことを明示する。これ以上機能拡張/変更されたくない
ときに
使う。インスタンス化はできる。
|
public
|
全てのクラスから参照できる。継承もインスタンス化も制限がない。
|
省略した場合
|
同じパッケージ内からしか参照できない。
|
2.メソッドについて
メソッドは、クラスの要素の一つです。
メソッドには、そのクラスをインスタンス化して作ったオブジェクトの機能
を記述します。オブジェクトを使う方法ともいえます。具体的には、入力、処理、
出力(Input/Process/Output)を記述します。多くの場合は、当該オブジェクト
のデータであるフィールドに対する処理になります。メソッドの入力、出力はそ
れぞれ、メソッド引数と戻り値と呼ばれます。
// []内は省略可です
[修飾子] 戻り値型 メソッド名([メソッド引数リスト]) {
処理内容
}
|
戻り値のデータ型は、メソッドが終了したときに返すデータ型です。
メソッドの装飾子には下の種類があります。
メソッドの修飾子
修飾子 |
説明 |
public
|
どこからでも呼び出せる。
|
protected
|
同じパッケージかそのサブクラスからしか呼び出せない。
|
省略した場合
|
同じパッケージ内からしか呼び出せない。
|
private
|
同じクラスからしか呼び出せない。
|
abstract
|
抽象メソッド。抽象メソッドを一つでも持つクラスは抽象クラス。メソッ
ド名、引数、戻り値は定義されているが、ブロック内の処理(実装)が行われ
て
いない。
|
static
|
静的メソッド。当該メソッドが定義されているクラスをインスタンス化し
なくても利用できる。インスタンスによらず同じ働きをするメソッドに用いる。
|
final
|
オーバーライドできないメソッド。継承によってこのメソッドの機能変更
拡張はできない。
|
synchronized
|
マルチスレッド時に同期を取るメソッド。スレッドに呼び出された時点で
ロックされる為、複数のプロセスによって実行されることがなくなる。
|
native
|
C/C++ 言語などのプラットフォーム依存のコードで作成された DLL など
を実体とするメソッド。
|
3.変数について
ここではローカル変数とクラス変数について考察する。
ローカル変数はメソッド内部で宣言されそのメソッドの処理が終わるとその値
は保持されない。C言語のローカル変数と同じようなものである。
クラス変数は普通static修飾子を付け、宣言する。
こうする事によって、プログラムの実行中、値を保持しすべてのクラスから参照
する事が可能になる。(変数として。)C言語で言う「グローバル変数」である。
staticを付けなかった場合、それはインスタンス変数と呼ばれ、グローバル変
数(メンバ変数)とは違い、そのクラス内でしか変数の値は保持しないが、オブ
ジェクトの状態は保持する変数となる。
4.オブジェクトについて
オブジェクトは、あるクラスに定義されたメソッドやフィールドを実際に扱
うために作成されます。クラスからオブジェクトを作成することをインスタンス
化と呼び、オブジェクト固有のメモリ上のデータをインスタンスと呼びます。
クラスをインスタンス化してオブジェクトを作成するには、次のように記述
します。
// オブジェクトを参照する変数宣言
クラス名 変数名;
// インスタンス化
変数名 = new クラス名();
|
また、次のようにも記述できます。
// インスタンス化
クラス名 変数名 = new クラス名();
|
まず、指定したクラス型の変数を定義しています。そして、この変数に、イ
ンスタンス化したオブジェクトへの参照が代入されます。この参照を通して、オ
ブジェクトは操作されます。
このようにして作ったオブジェクトのメソッドを利用するには次のようにし
ます。
変数名.メソッド名();
フィールドの利用も同様で
変数名.フィールド名;
|
5.アクセス制御について
アクセス制御とは他のクラスでprivate変数で宣言した変数を使わせないために
宣言します。つまり定義されたクラス内のメソッドからのみアクセスできます。
private以外にもprotectedとpublicがある。
protected変数を宣言すると、定義されたクラス内のメソッド、サブクラスなど
からのみアクセスできます。
public変数は全てのオブジェクト全てのメソッドからアクセスが可能です。