アルゴリズムとプログラミング

アルゴリズムとプログラミング
(Algorithms and Programming)
第6回:クラスとインスタンス
•クラスの宣言
•アクセス修飾子
•インスタンスの生成(newキーワード)
•thisキーワード
•フィールドとメソッドの実際の定義と使い方
講義資料等: http://www.pe.titech.ac.jp/~watanabe/lecture/ap/index-j.html
クラスの宣言
UMLにおけるクラス図
クラス名
猫
属性
尾の長さ
体重
ひげの本数
(attribute)
操作
(operation)
Javaにおけるクラスの宣言
class クラス名 {
フィールドの宣言
.....;
.....;
鳴く()
食べる()
歩く()
メソッドの宣言
.....;
.....;
}
猫(Cat)クラスの宣言
•クラス名を決める
•フィールド名とその型、可視性を決める
•メソッドを定義する(やり方は後述)
猫(Cat)
尾の長さ(length):double
体重(weight):double
ひげの本数(whisker):int
クラス名、フィールド名は識別子なので
命名規則は変数と同じ
識別子の命名規則
変数名,クラス名など
• 使える文字は半角文字の英字・数字・アンダースコア「_」に
限定(例外は多いが避けた方が無難)
• 半角英字の大文字・小文字は区別される
• 数字で始まる識別子は認めない
• キーワード(keyword)と呼ばれるJavaの予約語と、true・
false・nullの3単語は使用できない。(他の語句と組み合わ
せれば可)
• 長さに制限はない
Javaにおける可視性
UMLでは3種類だがJavaでは4種類
修飾子
指定無し
private
protected
public
アクセス可能な範囲
同じパッケージに属するクラスのみ
同一クラス内のみ
同一クラスおよびサブクラスのみ
全てのクラスからアクセス可能
猫(Cat)
+尾の長さ(length):double
#体重(weight):double
-ひげの本数(whisker):int
Catクラスの宣言
クラス図
猫(Cat)
+尾の長さ(length):double
#体重(weight):double
-ひげの本数(whisker):int
Javaにおけるクラスの宣言文
class Cat {
public double length;
protected double weight;
private int whisker;
}
(とりあえずフィールドのみの例)
Boxクラスの宣言
クラス図
Box
クラス宣言文
class Box {
-id_number: long
-width:double
#depth:double
+height:double
}
Boxクラスの宣言
クラス図
Box
-id_number: long
-width:double
#depth:double
+height:double
クラス宣言文
class Box {
private long id_number;
private double width;
protected double depth;
public double height;
}
インスタンスの生成
まず、インスタンスを格納する変数を定義する.
変数を定義するには、変数名と型が必要
変数名:識別子の命名規則に従って決める
型:クラス名がそのまま型になる
Catクラスのインスタンスを格納するための変数 p を定義
Cat
p;
(まだ実際のインスタンスは存在しない)
オブジェクト参照型変数
インスタンスの生成(II)
newキーワード
これで新たにインスタンスが
生成された!
p = new Cat();
メモリ領域を確保
0
1
2
Java VMが内部でやっていること
•まず、Catクラスのインスタンスを格納するた
めに必要なメモリ領域を新たに確保する
(new) 。
番地
データ
変数の中に先頭番地が
格納される
p
•確保したメモリ領域に、初期値を代入する
•そのメモリ先頭番地を変数pに格納する
•変数pにはインスタンスの中身は格納されて
おらず、その先頭番地のみが格納されている
•プログラマは、変数pを通してインスタンスの
中身を参照したり変更したりする
p
0
標識が立っているようなもの
1
2
番地
データ
newキーワードの使い方
Cat p;
p = new Cat();
変数の宣言と代入は1行でも書ける
Cat
p = new Cat();
フィールドの値を参照する書式
オブジェクト参照型変数.フィールド名
ピリオド
書式例)
p.length
実際に参照できるかどうかは
アクセス制限に依存する
フィールドへのアクセス(例)
weightフィールドに
値2000.0を代入する
p.weight=2000.0;
class Cat {
public double length;
protected double weight;
private int whisker;
}
ピリオドの後にフィールド名を指定する
lengthフィールドの値を表示
System.out.println( p.length );
メソッドの定義と利用
Javaにおけるクラスの宣言
クラス図
クラス名
猫
属性
尾の長さ
体重
ひげの本数
(attribute)
操作
(operation)
class クラス名 {
フィールドの宣言
.....;
.....;
鳴く()
食べる()
歩く()
メソッドの宣言
.....;
.....;
}
メソッドの定義
•メソッドは引数と、戻り値を持つ
•型は厳しくチェックされる
•複数の戻り値は持てない
書式:
戻り値の型 メソッド名(型 引数, 型 引数,...)
{
メソッドの処理の記述
return 戻り値;
}
C言語の「関数」と類似だが、型のチェックはずっと厳しい
2つの引数を受け取ってその和を
戻り値として返すメソッド
int addValue ( int a, int b ) {
return a+b ;
仮引数
}
戻り値の型
戻り値
必ずしも( )で囲う必要はない
戻り値が不要の場合
•戻り値の型をvoidと記述する
•return文は省略可
void printValue ( int a, int b ) {
System.out.println( "a=" + a );
System.out.println( "b=" + b );
}
引数も不要の場合
•引数の記述は省略可
void printHello () {
System.out.println( "Hello!" );
}
例)
class Cat {
public double weight;
private int whisker;
フィールド
メソッド
void printField() {
System.out.println("体重は"+weight+"g");
System.out.println("ひげは"+whisker+"本");
}
void setValue(double w, int n ) {
weight = w;
whisker = n ;
}
int getWeightKg(){
return (weight * 0.001 ) ;
}
}
thisキーワード
• あるクラス宣言の中で使用され、そのクラス
から生成されたオブジェクト自身を指す
this.weight
this.whisker
などが厳密な書き方
だが普通は省略される
例)
class Cat {
public double weight;
private int whisker;
同一クラス内なら
privateでも参照可
void printField() {
System.out.println("体重は"+weight+"g");
System.out.println("ひげは"+whisker+"本");
}
void setValue(double w, int n ) {
weight = w;
厳密にはthis.weight
whisker = n ;
だが通常はthisを省略
}
int getWeightKg(){
return (weight * 0.001 ) ;
}
}
メソッドの呼び出し方
先のCatクラス宣言文の後に追加して SampleCat.java とする
class SampleCat {
public static void main(String[] args) {
Cat p = new Cat();
p.setValue( 1000.0, 8 );
引数がある場合
p.printField();
int w_kg = p.getWeightKg();
戻り値がある場合
System.out.println("体重は"+ w_kg +"kg");
}
}
メソッドの呼び出し方
オブジェクト参照型変数.メソッド名(引数,引数,...)
ピリオド
実際に呼び出せるかどうかは
アクセス制限に依存する
まとめ
•クラスの宣言
アクセス修飾子
フィールドの定義
メソッドの定義
•インスタンスの生成(newキーワード)
•thisキーワード
•フィールドとメソッドの使用例