再帰性クラス

あるクラスは個人間のつながりをあらわしているとする。ヒトとうクラスを作成しているものとする。ヒトクラスのオブジェクトに、いま個人1がいて、個人2がいるとする。この個人のフィールドには、「父親」というフィールドがあるとして、個人2が個人1の父親だとすると、個人1というヒトクラスオブジェクトのフィールド「父親」の値は、ヒトクラスオブジェクトである個人2であることになる。

このようなとき、クラスの定義は再帰性に行う。次のようになる。

//Profile クラスの定義
class Chromosome {
	//フィールドの定義
	String pId; //ID
	String pCategory; //カテゴリ('a' or 'b')
	Chromosome pAncestor1; //第1アンセスター。5'端を持つアンセスター染色体
	String pAncestor2; //第2アンセスター。組換え体の場合に、第2のアンセスター
	String pForm1; //第1アンセスター染色体が父由来('p'か母由来('m')か
	String pForm2; //第2アンセスター染色体が父由来('p'か母由来('m')か
	String pRecpoints; //組換え発生点('5\t10\t40'は、5-6,10-11,40-41にて組換えがおきた結果、この染色体が出来上がったことを意味する

このように、pAncestor1フィールドの「型」はChromosomeクラスであることが記載されており、このような定義をしても、問題は発生しない。クラス作成時の再帰性の確認のみがしたかったので、Chromosome.javaソースは当該部分のみをバージョンアップし、"Chromosome4.java"として、テスト実行した。
参考のために、このソースも以下に貼付する。

//Profile クラスの定義
class Chromosome {
//フィールドの定義
String pId; //ID
String pCategory; //カテゴリ('a' or 'b')
Chromosome pAncestor1; //第1アンセスター。5'端を持つアンセスター染色体
String pAncestor2; //第2アンセスター。組換え体の場合に、第2のアンセスター
String pForm1; //第1アンセスター染色体が父由来('p'か母由来('m')か
String pForm2; //第2アンセスター染色体が父由来('p'か母由来('m')か
String pRecpoints; //組換え発生点('5\t10\t40'は、5-6,10-11,40-41にて組換えがおきた結果、この染色体が出来上がったことを意味する



void showProfile(){
//各フィールドの値をコンソール上に表示
System.out.println("*******第" + pId + "染色体の祖先染色体は*****");
System.out.println("第 " + pAncestor1 + " 染色体と第 " + pAncestor2 + " 染色体です");
System.out.println("第" + pId + "は" + pRecpoints + "にて組換えがおきてできた組換え体です");
}

//返り値ありのメソッド



String returnString(){
String returnValue;
returnValue = pRecpoints;
return returnValue;

}

}

//テスト用クラスの作成
class UseChromosome {



public static void main(String args[]){

//Chromosomeクラスのインスタンスを作成
Chromosome myChrom1 = new Chromosome();

//Chromosomeクラスのフィールドに値を代入
myChrom1.pId="1";
myChrom1.pCategory="a";
//myChrom1.pAncestor1="";
myChrom1.pAncestor2="";
myChrom1.pForm1="";
myChrom1.pForm2="";
myChrom1.pRecpoints="";

//Chromosomeクラスのインスタンスを作成
Chromosome myChrom2 = new Chromosome();

//Chromosomeクラスのフィールドに値を代入
myChrom2.pId="2";
myChrom2.pCategory="b";
//myChrom2.pAncestor1="1";
myChrom2.pAncestor2="";
myChrom2.pForm1="";
myChrom2.pForm2="";
myChrom2.pRecpoints="";

//Chromosomeクラスのインスタンスを作成
Chromosome myChrom3 = new Chromosome();

//Chromosomeクラスのフィールドに値を代入
myChrom3.pId="3";
myChrom3.pCategory="b";
//myChrom3.pAncestor1="1";
myChrom3.pAncestor2="2";
myChrom3.pForm1="f";
myChrom3.pForm2="m";
myChrom3.pRecpoints="5\t10";

//メソッドを呼び出す
System.out.println("myChrom1のプロファイルをメソッドで呼び出す\n");
myChrom1.showProfile();
System.out.println("myChrom2のプロファイルをメソッドで呼び出す\n");
myChrom2.showProfile();
System.out.println("myChrom3のプロファイルをメソッドで呼び出す\n");
myChrom3.showProfile();

}
}

class returnValuetest{



public static void main(String args[]){

//Chromosomeクラスのインスタンスを作成

//Chromosomeクラスのインスタンスを作成
Chromosome myChrom1 = new Chromosome();

//Chromosomeクラスのフィールドに値を代入
myChrom1.pId="1";
myChrom1.pCategory="a";
//myChrom1.pAncestor1="";
myChrom1.pAncestor2="";
myChrom1.pForm1="";
myChrom1.pForm2="";
myChrom1.pRecpoints="";

//Chromosomeクラスのインスタンスを作成
Chromosome myChrom2 = new Chromosome();

//Chromosomeクラスのフィールドに値を代入
myChrom2.pId="2";
myChrom2.pCategory="b";
//myChrom2.pAncestor1="1";
myChrom2.pAncestor2="";
myChrom2.pForm1="";
myChrom2.pForm2="";
myChrom2.pRecpoints="";

//Chromosomeクラスのインスタンスを作成
Chromosome myChrom3 = new Chromosome();

//Chromosomeクラスのフィールドに値を代入
myChrom3.pId="3";
myChrom3.pCategory="b";
//myChrom3.pAncestor1="1";
myChrom3.pAncestor2="2";
myChrom3.pForm1="f";
myChrom3.pForm2="m";
myChrom3.pRecpoints="5\t10";

Chromosome myChromR1 = new Chromosome();
myChromR1.pId="10(returntestID)";
myChromR1.pRecpoints=myChrom3.returnString();
System.out.println("myChromR1のpRecpointsにmyChrom3のそれを返り値つきメソッドで返し、、メソッドを介して代入された値を含むChromosomeオブジェクトのフィールドの値を表示させる\n");

myChromR1.showProfile();

Chromosome myChromR2 = new Chromosome();
myChromR2.pId="11";
myChromR2.pAncestor1=myChromR1;
System.out.println("myChromR2のpAncestor1にmyChromR1オブジェクトを代入してみた\n");

myChromR2.showProfile();

}
}