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

アルゴリズムとプログラミング
(Algorithms and Programming)
第7回:コンストラクタ、配列
•コンストラクタ
•メソッドのオーバーロード
•配列
講義資料等: http://www.pe.titech.ac.jp/~watanabe/lecture/ap/index-j.html
コンストラクタとは
• オブジェクトが生成される時に自動的に呼
び出される特別なメソッド
• メソッド名は必ずクラス名と一致する
• 戻り値の型を指定することはできない
• だからといってvoidを指定してはならない
記法:
修飾子 クラス名(仮引数の並び) {
処理の記述;
}
コンストラクタの定義と呼び出し
class Point { // 点クラス
double x; // x座標
double y; // y座標
public Point(double xx, double yy ){
x = xx; y = yy;
}
}
class SamplePoint {
public static void main(String[] args) {
Point p = new Point( 1.0, 2.0 );
System.out.println("x座標は"+ p.x +
" y座標は"+ p.y );
}
}
定義
呼び出し
コンストラクタの定義が無かったら
• 自動的にデフォルトコンストラクタが用意さ
れ、オブジェクトの生成時に呼び出される
Point( ) {
}
修飾子も引数も処理内容も無い
コンストラクタ
インスタンス生成時の記法:
Cat p = new Cat();
実はコンストラクタだった!
フィールドの初期化
• 初期値の与え方(どの方法でも良い)
コンストラクタを利用
setValue()の様な通常のメソッドを定義
フィールド宣言で初期値を代入
フィールド宣言による初期化
class Point { // 点クラス
double x = 0.0; // x座標(0.0で初期化)
double y = 0.0 ; // y座標(0.0で初期化)
}
インスタンスが生成される際
class SamplePoint {
にこの値が代入される
public static void main(String[]
args) {
Point p = new Point();
System.out.println("x座標は" + p.x +
" y座標は" + p.y );
}
}
メソッドのオーバーロード
一つのクラスの中に、同じ名前のメソッド
を複数定義することができる
ただし...
 引数の数が異なっているか、
引数の型が異なっていること
 戻り値の有無とは無関係
要するに..
引数を比べてお互いに区別が付けば、名前
が同じでも異なるメソッドとして認識される
メソッドのオーバーロードの例
Sample2601.java
class Sample2601 {
void printValue(int i) {
System.out.println("i = " + i
}
void printValue(double d) {
System.out.println("d = " + d
}
void printValue(int i, double d)
System.out.println("i = " + i
System.out.println("d = " + d
}
);
);
{
);
);
public static void main(String[] args) {
Sample2601 o = new Sample2601();
o.printValue(100);
引数に応じて、それぞれ対応する
o.printValue(0.25);
メソッドが自動的に呼び出される
o.printValue(100,0.25);
}
}
オーバーロード:間違いの例
Sample2602.java
class Sample2602 {
void printValue(int i) {
System.out.println("i = " + i );
}
戻り値は異なるが、引数で区別が
int printValue(int i) {
System.out.println("i = " + 付かないのでコンパイルエラー
i );
return i;
}
public static void main(String[] args) {
Sample2601 o = new Sample2601();
o.printValue(100);
int a = o.printValue(200);
}
}
コンストラクタのオーバーロード
class Point { // 点クラス
double x; // x座標
double y; // y座標
複数のコンストラクタ
を定義可能
public Point(){
x = 0; y = 0;
}
public Point(double xx, double yy ){
x = xx; y = yy;
}
}
class SamplePoint {
public static void main(String[] args) {
Point p0 = new Point();
Point p1 = new Point( 1.0, 2.0 );
}
}
コンストラクタから別のコンストラクタを呼び出すことも可
class Point { // 点クラス
double x; // x座標
double y; // y座標
public Point(){
this(0.0,0.0);
}
public Point(double xx,
x = xx; y = yy;
}
thisにより、別に定義されたコンストラ
クタを呼び出せる。
コンストラクタの最初の行でのみ使用可
double yy ){
}
class SamplePoint2 {
public static void main(String[] args) {
Point p0 = new Point();
Point p1 = new Point( 1.0, 2.0 );
}
}
配列
一つの変数に添え字を付けることにより
複数の値を格納するしくみ
例)
int型の値を格納するメモリ領域
を複数個(N個)準備する
a[0]
a[1]
a[2]
配
列
要
素
配列要素の書式)
a[0]
識別子
添え字 0から始まる
配列要素の型は全部同じ
int型ならint,doubleならdouble
a[N-1]
配列の宣言と利用法
newキーワードを使う
クラスからインスタンスを生成
するときと類似
1行で宣言する書式例)
int a[ ] = new int[10] ;
2行に分割する書式例)
int a[ ] ;
a = new int[10] ;
[]は不要
配列要素10個
分を宣言
•intなどの型名がクラス名に相当
•配列要素の数を[ ]で指定
•配列添え字が0から始まることに
注意せよ
a[0]
a[1]
a[9]
a[10]
10個分
10個分しか宣言して
なければエラー
配列要素への値の代入
a[0] = 1 ;
a[1] = 100 ;
a[2] = - 77 ;
•配列要素の数が足りなくなっ
ても後で追加できない!!最
初の指定が大事。
•配列添え字のオーバーフロー
に注意!!
newキーワードを使わない配列の宣言
int a[ ] = {20, 100, -40} ;
全ての配列要素を明示的に記述
int a[ ] = new int[3] ;
a[0] = 20;
a[1] = 100;
a[2] = - 40;
配列の識別子は参照型変数である
int a[ ] ;
a = new int[10] ;
b
a[0]
a
aは配列の先頭番地
を格納している
a[1]
a[2]
int b[];
b = a;
別の配列識別子bを定義して
aの内容をbに代入すると..
b
a
a[9]
aは参照型変数(番地を格納)
a[0]等で中身にアクセス
bもaと同じ配列の先頭番地を
格納することになるので...
たとえば
b[0]はa[0]と同じ値
b[3]はa[3]と同じ値
一つのメモリ領域を指している参照型
変数は一つとは限らない
配列のサイズを知る
Sample2301.java
class Sample2301 {
public static void main(String[] args) {
int array[] = {20,100,-40,500,70};
for(int i = 0; i < array.length; i++ ){
System.out.println( "array[" + i + "]= " +
array[i] );
}
}
}
実行結果
array[0]=
array[1]=
array[2]=
array[3]=
array[4]=
20
100
-40
500
70
配列の応用
問題:
与えられた配列の要素を、大きい順に並べ替
えなさい
方針(例): 配列の先頭から、一つ一つ順番に値を比べて、
大きい値と出会ったら入れ替える
a[0]
a[1]
a[2]
a[3]
a[4]
配列添え字i
配列添え字j
work 入れ替え用
一時記憶変数
SampleAPP0701.java
class SampleAPP0701 {
public static void main(String[] args) {
int array[] = {20,100,-40,500,70};//与えられた配列
int work; //入れ替え用の一時メモリ
for(int i = 0; i < array.length - 1; i++ ){
for(int j =
; j <
; j++ ){
if( array[i] < array[j] ) { //大きな数字と出会ったら
work = array[ ]; //入れ替える
array[ ] = array[ ];
array[ ] = work;
}
}
} //以下は結果の表示
for(int i=0; i < array.length; i++ ){
System.out.println( "array[" + i + "]= " +
array[i] );
}
}
}
SampleAPP0701.java
class SampleAPP0701 {
public static void main(String[] args) {
int array[] = {20,100,-40,500,70};//与えられた配列
int work; //入れ替え用の一時メモリ
for(int i = 0; i < array.length - 1; i++ ){
for(int j = i+1; j < array.length; j++ ){
if( array[i] < array[j] ) { //大きな数字と出会ったら
work = array[i]; //入れ替える
array[i] = array[j];
array[j] = work;
}
}
} //以下は結果の表示
for(int i=0; i < array.length; i++ ){
System.out.println( "array[" + i + "]= " +
array[i] );
}
}
}
まとめ
•コンストラクタ
•メソッドのオーバーロード
•配列の宣言と使用例