学生向けプログラミング入門

学生向けにプログラミングを解説。Java、C++、Ruby、PHP、データベース

Javaプログラミング入門その20 コンストラクタを作成、利用するプログラムその1

<<前  [TOP]  次>>


メモ帳を開いて次の2つのプログラムを作ってみましょう。


Elephant.java 直

public class Elephant {

	public String name;

	public int age;

	public int weight;
}



ElephantTest.java 直

public class ElephantTest {

	public static void main( String[] args ) {

		Elephant e1 = new Elephant();
		e1.name = "花子";
		e1.age = 8;
		e1.weight = 5000;

		Elephant e2 = new Elephant();
		e2.name = "太郎";
		e2.age = 7;
		e2.weight = 6000;

		printElephant( e1 );
		printElephant( e2 );
	}

	public static void printElephant( Elephant e ) {

		System.out.println( "名前:" + e.name + "," + "年齢:" + e.age + "," + "体重:" + e.weight);
	}
}



まずは「Elephant.java」の内容を見ていきます。

public String name;
public int age;
public int weight;

動的フィールドのみのクラスになっています。
メソッドはありませんが、このフィールドを使うにはこのクラス名でのインスタンスの生成が必要です。
このクラス単独では実行できません。
コンパイルのみを行います。


「ElephantTest.java」の内容を見ていきます。

Elephant e1 = new Elephant();
e1.name = "花子";
e1.age = 8;
e1.weight = 5000;

インスタンスを生成して、Elephantクラスのフィールドに値を代入しています。
動的フィールドを他のクラスから利用するには次のようにします。

インスタンス名.フィールド名 = 代入するもの;


printElephant( e1 );
printElephant( e2 );

インスタンスを引数に使っています。

public static void printElephant( Elephant e ) 

引数を受け取る側は、(クラス名 インスタンス名)とします。
そうすることで、インスタンス同士の代入が行われます。

Elephant e = Elephant e1;

このように、インスタンス同士の代入も可能です。


出力結果です。
コンパイルは「Elephant.java」と「ElephantTest.java」の両方行います。
実行するのは「ElephantTest.java」のみです。





メモ帳を開いて次のプログラムを作ってみましょう。


ElephantTest2.java 直

public class ElephantTest2 {
	public static void main ( String[] args ) {
		Elephant[] e = new Elephant[3];
		
		e[0] = new Elephant();
		e[0].name = "花子";
		e[0].age = 8;
		e[0].weight = 5000;

		e[1] = new Elephant();
                e[1].name = "太郎";
                e[1].age = 7;
                e[1].weight = 6000;

		e[2] = new Elephant();
                e[2].name = "ゴン太";
                e[2].age = 1;
                e[2].weight = 1000;

		for( int i=0; i<e.length; i++ ) {
			printElephant( e[i] );
		}
	}

	public static void printElephant( Elephant e ) {
		System.out.println( "名前:" + e.name + "," + "年齢:" + e.age + "," + "体重:" + e.weight );
	}
}



次の行を見て下さい。

Elephant[] e = new Elephant[3];

インスタンスを入れる配列を作成します。
インスタンスを使った配列の使い方の確認プログラムです。


実行結果です。
「Elephant.java」をコンパイルしておく必要があります。





メモ帳を開いて次の2つのプログラムを作ってみましょう。


ElephantFamily.java 直

public class ElephantFamily {

	public Elephant father;
	public Elephant mother;
	public Elephant[] children;

}



ElephantFamilyTest.java 直

public class ElephantFamilyTest {
	
	public static void main ( String[] args ) {

		ElephantFamily ef = new ElephantFamily();

		ef.father = new Elephant();
		ef.father.name = "太郎";
		ef.father.age = 7;
		ef.father.weight = 6000;

		ef.mother = new Elephant();
		ef.mother.name = "花子";
		ef.mother.age = 8;
		ef.mother.weight = 5000;

		ef.children = new Elephant[2];
		ef.children[0] = new Elephant();
		ef.children[0].name = "ゴン太";
		ef.children[0].age = 1;
		ef.children[0].weight = 1000;

		ef.children[1] = new Elephant();
                ef.children[1].name = "マリア";
                ef.children[1].age = 0;
                ef.children[1].weight = 500;

		printElephantFamily( ef );
	}

	public static void printElephant( Elephant e ) {

		System.out.println( "名前:" + e.name + "," + "年齢:" + e.age + "," + "体重:" + e.weight );

	}

	public static void printElephantFamily( ElephantFamily family ) {

		System.out.print( "[父親]" );
		printElephant( family.father );

		System.out.print( "[母親]" );
		printElephant( family.mother );

		for( int i=0; i<family.children.length; i++ ) {
			System.out.print( "[子供" + i + "]" );
			printElephant( family.children[i] );
		}
	}
}



「ElephantFamily.java」の内容から見ていきましょう。


Elephantクラスでインスタンス(father,mother)を宣言するのみを行っています。

public Elephant[] children;

インスタンスの配列を宣言しています。


「ElephantFamilyTest.java」の内容を見ていきます。


二重にインスタンスを宣言するときは次のように二重にインスタンスを生成します。

ElephantFamily ef = new ElephantFamily();

ef.father = new Elephant();
ef.father.name = "太郎";
ef.father.age = 7;
ef.father.weight = 6000;

まず、ElephantFamilyのインスタンスを生成します。
このときのインスタンス名は ef です。

ElephantFamily ef = new ElephantFamily();

その後、ElephantFamilyのフィールドに対してElephantのインスタンスを生成します。
このときのインスタンス名は、ef.fatherです。

ef.father = new Elephant();

この、Elephantのインスタンスを利用して、Elephantのフィールドに値を代入します。
ef.father.name = "太郎";


配列の二重のインスタンス生成も同じです。

ef.children = new Elephant[2];

インスタンス配列の領域を確保します。

ef.children[0] = new Elephant();

その配列の領域にElephantのインスタンスを生成します。

ef.children[0].name = "ゴン太";

そのインスタンスを利用し、その領域に値を代入します。


printElephantFamilyメソッドを見てください。

printElephant( family.father );

このように、引数にfamily.fatherを渡しています。
これは、Elephantのインスタンスですので、そのまま、printElephantメソッドの引数(Elephant e)に渡されます。


実行結果です。
「Elephant.java」「ElephantFamily.java」「ElephantFamilyTest.java」の3つのプログラムをコンパイルする必要があります。
実行するプログラムは「ElephantFamilyTest.java」です。





メモ帳を開いて次の2つのプログラムを作ってみましょう。


Elephant2.java 直

public class Elephant2 {

	String name;

	int age;

	int weight;

	public Elephant2( String s, int i1, int i2 ) {

		name = s;
		age = i1;
		weight = i2;
	}
}

ElephantFamilyTest2.java 直

public class ElephantFamilyTest2 {

	public static void main( String[] args ) {

		Elephant2[] e = {
				new Elephant2( "マリア", 1, 500 ),
				new Elephant2( "ゴン太", 2, 1000 ),
				new Elephant2( "太郎", 7, 6000 ),
				new Elephant2( "花子", 8, 5000 ),
				};

		printElephants( e );

		System.out.println( "体重合計:" + totalWeight( e ));
	
		System.out.println( "平均年齢:" + averageAge( e ));

		Elephant2 he = heavyElephant( e );

		System.out.println( "一番重い象:" + he.name );

		Elephant2 ye = youngElephant( e );

		System.out.println( "一番若い象:" + ye.name );

		sortElephantsByAge( e );
		
		printElephants( e );

	}

	public static void printElephant( Elephant2 e ) {

		System.out.println( "名前:" + e.name + "," + "年齢:" + e.age + "," + "体重:" + e.weight );

	}

	public static void printElephants( Elephant2[] e ) {

		for( int i=0; i<e.length; i++ ) {

			printElephant( e[i] );

		}
	}

	
	public static int totalWeight( Elephant2[] e ) {

		int sum = 0;
		
		for( int i=0; i<e.length; i++ ) {

			sum = sum + e[i].weight;

		}
		return sum;
	}

	public static float averageAge( Elephant2[] e ) {

		float ave = 0.0f;
		int agesum = 0;

		for( int i=0; i<e.length; i++ ) {
			agesum = agesum + e[i].age;
		}
		ave = agesum/e.length;
		return ave;
	}
	public static Elephant2 heavyElephant( Elephant2[] e ) {

		Elephant2 max = e[0];

		int maxe = e[0].weight;

		for( int i=1; i<e.length; i++ ) {

			int maxweight = e[i].weight;

			if( maxe < maxweight  ) {

				maxe = e[i].weight;
				max = e[i];
			}
			
		}
		return max;

	}

	public static Elephant2 youngElephant( Elephant2[] e ) {

		Elephant2 min = e[0];

		int mine = e[0].age;

		for( int i=1; i<e.length; i++ ) {

			int youngage = e[i].age;

			if( mine > youngage ) {

				mine = e[i].age;
				min = e[i];

			}
		}
		return min;
	}
	public static void sortElephantsByAge( Elephant2[] e ) {

		for( int i=0; i<e.length-1; i++ ) {

			Elephant2 max = e[i];
			int maxe = e[i].age;

			int maxindex = i;

			for( int j=i+1; j<e.length; j++ ) {

				int maxage = e[j].age;

				if( maxage > maxe ) {

					maxe = e[j].age;
					max = e[j];
					maxindex = j;
				}
			}
			
			e[maxindex] = e[i];
			e[i] = max;
		}
	} 

}



「Elephant2.java」は「Elephant.java」にコンストラクタを追加しました。


では「ElephantFamilyTest2.java」を見ていきます。

Elephant2[] e = {
    new Elephant2( "マリア", 1, 500 ),
    new Elephant2( "ゴン太", 2, 1000 ),
    new Elephant2( "太郎", 7, 6000 ),
    new Elephant2( "花子", 8, 5000 ),
};

インスタンスの配列に、作成したインスタンスを直接格納しています。
引数を与え、Elephant2クラスのコンストラクタを利用しフィールドの値を初期化しています。


printElephantsメソッドの内容を見ていきましょう。


与えられたインスタンスの配列を一つずつのインスタンスに分けてprintElephantメソッドに渡しています。
printElephantメソッドでは、与えられたインスタンスの内容をそのまま表示しています。


totalWeightメソッドは体重の合計をint型の値で返します。


averageAgeメソッドhは平均年齢をfloat型の値で返します。


heavyElephantメソッドは一番重い体重のインスタンスを返します。


youngElephantメソッドは一番若い象のインスタンスを返します。


sortElephantsByAgeメソッドは与えられたインスタンス配列を年齢の大きい順に並び替えてインスタンスを格納し直します。


「Elephant2.java」と「ElephantFamilyTest2.java」をコンパイルして、「ElephantFamilyTest2.java」を実行してみましょう。





<<前  [TOP]  次>>