↓↓クリックして頂けると励みになります。
【21 | Frame】 << 【ホーム】 >> 【23 | コンストラクタの応用】
Javaにおけるコンストラクタ(Constructor)は、クラスからオブジェクトを作成する際に呼び出される特殊なメソッドです。
コンストラクタは、クラスと同じ名前を持ち、戻り値の型を指定せず、メソッドとして定義されます。
コンストラクタは通常、新しいオブジェクトの初期化に使用されます。
コンストラクタは、以下の特徴を持ちます。
- コンストラクタは、クラスのインスタンスが生成される直前に自動的に呼び出されます。
- コンストラクタのオーバーロードが可能です。つまり、複数のコンストラクタを定義することができます。
- コンストラクタは継承されませんが、サブクラスのコンストラクタ内で、親クラスのコンストラクタを呼び出すことができます(super()を使用)。
- コンストラクタを使用することで、オブジェクトの初期化や必要な初期設定を行うことができます。
Visual Studio Codeで以下の2つのプログラム「Elephant.java」「ElephantTest.java」を作成します。
新規作成1 【Elephant.java】
public class Elephant { public String name; public int age; public int weight; }
新規作成2【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」のみです。
~/Desktop/Programming/JP $ javac Elephant.java ~/Desktop/Programming/JP $ javac ElephantTest.java ~/Desktop/Programming/JP $ java ElephantTest 名前:花子,年齢:8,体重:5000 名前:太郎,年齢:7,体重:6000
Visual Studio Codeで以下のプログラム「ElephantTest2.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」を利用しています。
~/Desktop/Programming/JP $ javac ElephantTest2.java ~/Desktop/Programming/JP $ java ElephantTest2 名前:花子,年齢:8,体重:5000 名前:太郎,年齢:7,体重:6000 名前:ゴン太,年齢:1,体重:1000
Visual Studio Codeで以下の2つのプログラム「ElephantFamily.java」「ElephantFamilyTest.java」を作成します。
新規作成1 【ElephantFamily.java】
public class ElephantFamily { public Elephant father; public Elephant mother; public Elephant[] children; }
新規作成2 【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」です。
~/Desktop/Programming/JP $ javac ElephantFamily.java ~/Desktop/Programming/JP $ javac ElephantFamilyTest.java ~/Desktop/Programming/JP $ java ElephantFamilyTest [父親]名前:太郎,年齢:7,体重:6000 [母親]名前:花子,年齢:8,体重:5000 [子供0]名前:ゴン太,年齢:1,体重:1000 [子供1]名前:マリア,年齢:0,体重:500
Visual Studio Codeで以下の2つのプログラム「Elephant2.java」「ElephantFamilyTest2.java」を作成します。
新規作成1 【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; } }
新規作成2 【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メソッド
は平均年齢をfloat型の値で返します。
heavyElephantメソッド
は一番重い体重のインスタンスを返します。
youngElephantメソッド
は一番若い象のインスタンスを返します。
sortElephantsByAgeメソッド
は与えられたインスタンス配列を年齢の大きい順に並び替えてインスタンスを格納し直します。
「Elephant2.java」と「ElephantFamilyTest2.java」をコンパイルして「ElephantFamilyTest2.java」を実行してみましょう。
~/Desktop/Programming/JP $ javac Elephant2.java ~/Desktop/Programming/JP $ javac ElephantFamilyTest2.java ~/Desktop/Programming/JP $ java ElephantFamilyTest2 名前:マリア,年齢:1,体重:500 名前:ゴン太,年齢:2,体重:1000 名前:太郎,年齢:7,体重:6000 名前:花子,年齢:8,体重:5000 体重合計:12500 平均年齢:4.0 一番重い象:太郎 一番若い象:マリア 名前:花子,年齢:8,体重:5000 名前:太郎,年齢:7,体重:6000 名前:ゴン太,年齢:2,体重:1000 名前:マリア,年齢:1,体重:500
【21 | Frame】 << 【ホーム】 >> 【23 | コンストラクタの応用】
↓↓クリックして頂けると励みになります。