アルゴリズムとプログラミング (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] ); } } } まとめ •コンストラクタ •メソッドのオーバーロード •配列の宣言と使用例
© Copyright 2025 ExpyDoc