210 likes | 302 Views
アルゴリズムとプログラミング (Algorithms and Programming). コンストラクタ メソッドのオーバーロード 配列. 第7回:コンストラクタ、配列. 講義資料等:. http://www.pe.titech.ac.jp/~watanabe/lecture/ap/index-j.html. コンストラクタとは. オブジェクトが生成される時に 自動的に呼び出される 特別なメソッド メソッド名は必ず クラス名と一致 する 戻り値の型を指定することはできない だからといって void を指定してはならない. 記法:.
E N D
アルゴリズムとプログラミング(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, 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[0] a[1] 配列要素 a[2] 識別子 添え字 0から始まる 配列要素の型は全部同じ int型ならint,doubleならdouble a[N-1]
配列の宣言と利用法 クラスからインスタンスを生成するときと類似 newキーワードを使う 1行で宣言する書式例) • intなどの型名がクラス名に相当 • 配列要素の数を[ ]で指定 • 配列添え字が0から始まることに注意せよ int a[ ] = new int[10] ; 2行に分割する書式例) a[0] a[1] int a[ ] ; a = new int[10] ; 10個分 a[9] 10個分しか宣言してなければエラー a[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;
b 配列の識別子は参照型変数である a aは配列の先頭番地 を格納している int a[ ] ; a = new int[10] ; int b[]; b = a; a[0] a[1] 別の配列識別子bを定義して aの内容をbに代入すると.. a[2] b a a[9] bもaと同じ配列の先頭番地を 格納することになるので... たとえば b[0]はa[0]と同じ値 b[3]はa[3]と同じ値 aは参照型変数(番地を格納) a[0]等で中身にアクセス 一つのメモリ領域を指している参照型変数は一つとは限らない
配列のサイズを知る 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]= 20 array[1]= 100 array[2]= -40 array[3]= 500 array[4]= 70
配列の応用 配列添え字i 配列添え字j 問題: 与えられた配列の要素を、大きい順に並べ替えなさい 方針(例): 配列の先頭から、一つ一つ順番に値を比べて、大きい値と出会ったら入れ替える a[0] 入れ替え用 一時記憶変数 work a[1] a[2] a[3] a[4]
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] ); } } }
まとめ • コンストラクタ • メソッドのオーバーロード • 配列の宣言と使用例