アアアアアアアアアアアアアア (Algorithms and Programming) ア アア アアアアアアアア アア 7:、 •アアアアアアア •アアアアアアアアアアアア •アア アアアアア: http://www.pe.titech.ac.jp/~watanabe/lecture/ap/index-j.html
Jan 07, 2016
アルゴリズムとプログラミング
(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 );
}
}
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 );
}
}
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 );
}
}
インスタンスが生成される際にこの値が代入される
フィールド宣言による初期化
メソッドのオーバーロード一つのクラスの中に、同じ名前のメソッドを複数定義することができる
ただし...引数の数が異なっているか、
引数の型が異なっていること
戻り値の有無とは無関係引数を比べてお互いに区別が付けば、名前が同じでも異なるメソッドとして認識される
要するに..
メソッドのオーバーロードの例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); }}
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); }}
Sample2601.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 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); }}
Sample2602.java
戻り値は異なるが、引数で区別が付かないのでコンパイルエラー
コンストラクタのオーバーロード
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(){ 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, double yy ){ x = xx; y = yy; }} class SamplePoint2 { 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, double yy ){ x = xx; y = yy; }} class SamplePoint2 { public static void main(String[] args) { Point p0 = new Point(); Point p1 = new Point( 1.0, 2.0 ); }}
コンストラクタから別のコンストラクタを呼び出すことも可
this により、別に定義されたコンストラクタを呼び出せる。コンストラクタの最初の行でのみ使用可
配列一つの変数に添え字を付けることにより複数の値を格納するしくみ
int 型の値を格納するメモリ領域を複数個 (N 個 ) 準備する
a[0]
例)
a[1]a[2]
a[N-1]
配列要素の書式)
a[0]添え字識別子
配列要
素
配列要素の型は全部同じint 型なら int,double なら double
配列要素の型は全部同じint 型なら int,double なら double
0 から始まる
配列の宣言と利用法
int a[ ] = new int[10] ;
クラスからインスタンスを生成するときと類似
1行で宣言する書式例)
2行に分割する書式例)int a[ ] ;a = new int[10] ;
•int などの型名がクラス名に相当
•配列要素の数を [ ] で指定•配列添え字が0から始まることに注意せよ
•int などの型名がクラス名に相当
•配列要素の数を [ ] で指定•配列添え字が0から始まることに注意せよ
[] は不要[] は不要
new キーワードを使う
a[0]a[1]
a[10]a[9]
10 個分
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[ ] = new int[3] ;a[0] = 20;a[1] = 100;a[2] = - 40;
全ての配列要素を明示的に記述
配列の識別子は参照型変数である
int a[ ] ;a = new int[10] ;
int b[];b = a;
a[0]
a[1]
a[2]
a[9]
a a は配列の先頭番地を格納している
別の配列識別子 b を定義してa の内容を b に代入すると..
b a
b
b も a と同じ配列の先頭番地を格納することになるので...たとえばb[0] は a[0] と同じ値b[3] は a[3] と同じ値
a は参照型変数 ( 番地を格納 )
a[0] 等で中身にアクセスa は参照型変数 ( 番地を格納 )
a[0] 等で中身にアクセス一つのメモリ領域を指している参照型変数は一つとは限らない
配列のサイズを知る
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] ); } }}
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]= 20array[1]= 100array[2]= -40array[3]= 500array[4]= 70
array[0]= 20array[1]= 100array[2]= -40array[3]= 500array[4]= 70
実行結果
Sample2301.java
配列の応用問題:
与えられた配列の要素を、大きい順に並べ替えなさい与えられた配列の要素を、大きい順に並べ替えなさい
方針 ( 例 ) : 配列の先頭から、一つ一つ順番に値を比べて、大きい値と出会ったら入れ替える
a[0]a[1]a[2]
配列添え字 i
配列添え字 jwork 入れ替え用
一時記憶変数
a[3]a[4]
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] ); } }}
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] ); } }}
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] ); } }}
SampleAPP0701.java
まとめ
•コンストラクタ•メソッドのオーバーロード•配列の宣言と使用例
•コンストラクタ•メソッドのオーバーロード•配列の宣言と使用例