キーワード辞典
物凄く乱暴なJava for全商1級+

登録日 16/10/14   更新日 16/11/30



科学者とビーカーの水でみる9つのクラスとその配列の例

詳しくは公式マニュアルをお読みください。
Javaって、こんな風にも書ける、とか、こうとも言う、とか、色々有るので、 以下は雰囲気だけのざっくりとした説明です。
作成中です。ミス有ったら後免。




1.オブジェクトの実体化

科学者が、Aというラベルを貼った 500ml のサイズのビーカー、a を実体化した。
ビーカーの中には何も入っていない。
この状態では、ビーカーが有るだけで、全く何も出来ず、実行しても画面は全く変わらない。
科学者は、同様に b 、 c 、などと幾つもビーカーを実体化させることが出来るが、全て同じ値を持つ。

ビーカー(Beaker_1.java)
// Beaker_1.java			2016.10.13	by Ryn

public class Beaker_1 {											// ビーカーの仕様

	private String label = "A";									// Aというラベルが貼ってある
	private int size = 500;											// サイズは、500ml
	private int water = 0;											// 最初は、からっぽ

}

ビーカーを実体化させた科学者(Scientist_1.java)
// Scientist_1.java			2016.10.13	by Ryn

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

		Beaker_1   a = new Beaker_1();						// ビーカー a を実体化

	}
}


参考1:クラスは参照型
Scientist_1.java の7行目は、細かく書くと、以下の様になる。
		Beaker_1   a;
		a = new Beaker_1();
1行目
   a
  -+--------+-
   | addr   | ← Beaker_1クラスの a の
  -+--------+-     先頭アドレスを記憶する為のメモリ領域を確保
    ↑
2行目 ↑
      a.label  a.size   a.water
    -+--------+--------+--------+-
     | addr   |    500 |      0 | ← a の為のメモリ領域を、
    -+--------+--------+--------+-     Beaker_1クラスに必要な大きさで確保
       ↑
       ↑
      a.label のメモリ領域の先頭アドレス(String は参照型=文字列は長さが不定なので)




2.ゲッターメソッド

不用意に操作されない様に private にしてあるデータメンバの値を取り出すための public なメソッドを、ゲッターメソッドと言う。
データメンバの値を return で戻り値として取り出す。
get~ という名前を付ける慣習が有る。

ビーカーのデータメンバ(ラベル、サイズ、水の量)の値を取り出せるようにした。

ビーカー(Beaker_2.java)
// Beaker_2.java			2016.10.13	by Ryn

public class Beaker_2 {

	private String label = "A";
	private int size = 500;
	private int water = 0;

	public String getLabel() {						// ラベル名を String で返すゲッターメソッド
		return label;
	}

	public int getSize() {								// サイズを int で返すゲッターメソッド
		return size;
	}

	public int getWater() {								// 水の量を int で返すゲッターメソッド
		return water;
	}
}

科学者(Scientist_2.java)
// Sientist_2.java			2016.10.13	by Ryn

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

		Beaker_2   a = new Beaker_2();

		System.out.printf("label[ %-6s ] size = %4dml / water = %4dml¥n",
																		 a.getLabel(), a.getSize(), a.getWater());
	}
}



3.まとめて処理

クラス内で完結し、よく使う一連の処理は、クラス内で定義すると便利。

ビーカー(Beaker_3.java)
// Beaker_3.java			2016.10.13	by Ryn

public class Beaker_3 {

	private String label = "A";
	private int size = 500;
	private int water = 0;

	public void dispData() {
		System.out.printf("label[ %-6s ] size = %4dml / water = %4dml¥n",
																											label, size, water);
	}
}

科学者(Scientist_3.java)
// Scientist_3.java			2016.10.13	by Ryn

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

		Beaker_3   a = new Beaker_3();

		a.dispData();
	}
}



4.セッターメソッド

不用意に操作されない様に private にしてあるデータメンバの値の設定をするための public なメソッドを、セッターメソッドと言う。
セッターメソッドは、引数をデータメンバの値に代入する。
set~ という名前を付ける慣習が有る。

ビーカーのラベルの張り替えを出来る様にする。
label へのみの操作を setLabel メソッド限定で行うことで、ミスを防ぐ事が出来る。

ビーカー(Beaker_4.java)
// Beaker_4.java			2016.10.13	by Ryn

public class Beaker_4 {

	private String label = "";
	private int size = 500;
	private int water = 0;

	public void setLabel(String label) {					// ラベルを貼るセッターメソッド
		this.label = label;
	}

	public void dispData() {
		System.out.printf("label[ %-6s ] size = %4dml / water = %4dml¥n",
																											label, size, water);
	}
}

科学者(Scientist_4.java)
Redラベルのビーカー a と、Greenラベルのビーカー b を実体化する。
// Scientist_4.java			2016.10.13	by Ryn

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

		Beaker_4   a = new Beaker_4();
		a.setLabel("Red");
		Beaker_4   b = new Beaker_4();
		b.setLabel("Green");

		a.dispData();
		b.dispData();
	}
}



5.データメンバへの処理

さらに、ビーカーに対して指定した量の水を足したり出したり出来る様にする。
ビーカーに水を入れる場合はプラスの値、取り出す場合はマイナスの値を指定する。
ただし、水を足す事によって溢れたり、水を出すのに足りなかったりする場合は、エラーで無効とする。
water への操作を moveWater メソッドに限定する事で、矛盾を防ぐ事が出来る。

ビーカー(Beaker_5.java)
// Beaker_5.java			2016.10.13	by Ryn

public class Beaker_5 {

	private String label = "";
	private int size = 500;
	private int water = 0;

	public void setLabel(String label) {
		this.label = label;
	}


	public void moveWater(int water) {
		
		int i = this.water + water;
		System.out.printf("label[ %-6s ] %3dml + %3dml = %4dml",
																						label, this.water, water, i);

		if(i <= size && i >= 0)
			this.water = i;
		else
			System.out.print(" *Error!*");

		System.out.println();
	}


	public void dispData() {
		System.out.printf("label[ %-6s ] size = %4dml / water = %4dml¥n",
																											label, size, water);
	}
}

科学者(Scientist_5.java)
キーボードから水の量を入力する。
ビーカーに水を入れる場合はプラスの値、取り出す場合はマイナスの値を指定する。
0を入力すると、終了。
import java.util.Scanner;

// Scientist_5.java			2016.10.13	by Ryn

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

		Beaker_5   a = new Beaker_5();
		a.setLabel("Red");
		
		a.dispData();

		int water;
		Scanner sc = new Scanner(System.in);
		System.out.print("water? : ");
		water  = sc.nextInt();
		while(water != 0){
			a.moveWater(water);
			a.dispData();
			System.out.print("water? : ");
			water  = sc.nextInt();
		}
		sc.close();
		System.out.println("終了");
	}
}



6.コンストラクタ

クラスと同じ名前を持つ特別な関数。メソッドではない。
クラスがインスタンス化(実体化、つまり、プログラム中で「new」)された時に呼び出され、 クラスをインスタンス化し、そのインスタンスの初期化などを行う。 コンストラクタは、オーバーライド、オーバーロード(後述)が出来る。
コンストラクタを書かない場合は、実体化以外は何もしないデフォルトコンストラクタが自動的に実行される。
コンストラクタに引数を渡すことは出来るが、戻り値は、暗黙に、そのオブジェクト自体(の参照)なので、 コンストラクタに 戻り値に関する記述をすると実行時にエラーになる。

ビーカーを実体化する際にのみ、ラベルとサイズを設定出来る様にした。
これで科学者は、色々なラベル、色々な大きさのビーカーを実体化させることが出来る。
途中でラベルやサイズを変える事は出来ない。

ビーカー(Beaker_6.java)
// Beaker_6.java			2016.10.13	by Ryn

public class Beaker_6 {

	private String label;
	private int size;
	private int water = 0;

	public Beaker_6(String label, int size) {				// コンストラクタ
		this.label = label;
		this.size = size;
	}


	public void moveWater(int water) {
		
		int i = this.water + water;
		System.out.printf("label[ %-6s ] %3dml + %3dml = %4dml",
																						label, this.water, water, i);

		if(i <= size && i >= 0)
			this.water = i;
		else
			System.out.print(" *Error!*");

		System.out.println();
	}


	public void dispData() {
		System.out.printf("label[ %-6s ] size = %4dml / water = %4dml¥n",
																											label, size, water);
	}
}

科学者(Scientist_6.java)
ラベルとサイズの違う2つのビーカー a と b を用意し、同じ量の水の出し入れを行う。
キーボードから水の量を入力する。
ビーカーに水を入れる場合はプラスの値、取り出す場合はマイナスの値を指定する。 0を入力すると、終了。
追跡の為の dispData が多くて五月蝿いですが、やっている事はシンプルです。
import java.util.Scanner;

// Scientist_6.java			2016.10.13	by Ryn

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

		Beaker_6   a = new Beaker_6("Red",500);
		Beaker_6   b = new Beaker_6("Green",720);
		
		a.dispData();
		b.dispData();

		int water;
		Scanner sc = new Scanner(System.in);
		System.out.print("water? : ");
		water  = sc.nextInt();
		while(water != 0){
			a.moveWater(water);
			b.moveWater(water);
			System.out.println();
			a.dispData();
			b.dispData();
			System.out.print("water? : ");
			water  = sc.nextInt();
		}
		sc.close();
		System.out.println("終了");
	}
}



7.水の入れ替え

2つの同じサイズのビーカー a 、 b の中の水を、正攻法で入れ替えます。

ビーカー(Beaker_7.java)
これまでに出て来たメソッドのみです。
moveWater() のメッセージが五月蝿いので、無効にしてあります。
//Beaker_7.java      2016.11.30  by Ryn

public class Beaker_7 {

	private String label;
	private int size;
	private int water = 0;

	public Beaker_7(String label, int size) {
		this.label = label;
		this.size = size;
	}

	public int getSize() {
		return size;
	}

	public int getWater() {
		return water;
	}


	public void moveWater(int water) {

		int i = this.water + water;
//	System.out.printf("label[ %-6s ] %3dml + %3dml = %4dml",
//																					label, this.water, water, i);

		if(i <= size && i >= 0)
			this.water = i;
//	else
//		System.out.print(" *Error!*");
//
//	System.out.println();
	}


	public void dispData() {
		System.out.printf("label[ %-6s ] size = %4dml / water = %4dml¥n",
																											label, size, water);
	}
}

科学者(Scientist_7.java)
追跡の為の dispData が多くてウザいですが、やっている事はシンプルです。
//Scientist_7.java      2016.11.30  by Ryn

public class Scientist_7 {

	// swap method

	public static boolean swap(Beaker_7  x, Beaker_7  y) {

		if(x.getSize() == y.getSize()){				// サイズが同じか?

			Beaker_7   temp = new Beaker_7("Temp", x.getSize());

			x.dispData();												// swap before
			y.dispData();
			temp.dispData();

			temp.moveWater(x.getWater());				// x → temp
			x.moveWater(- x.getWater());

			x.moveWater(y.getWater());					// y → x
			y.moveWater(- y.getWater());

			y.moveWater(temp.getWater());				// temp → y
			temp.moveWater(- temp.getWater());

			System.out.println(" ↓");
			x.dispData();												// swap after
			y.dispData();
			temp.dispData();

			return true;												// 成功した
		}else
			return false;												// サイズが違った
	}

	// main method

	public static void main(String[] args) {

		Beaker_7   a = new Beaker_7("A",500);			// ビーカー
		Beaker_7   b = new Beaker_7("B",500);

		a.moveWater(350);													// 水を入れた
		b.moveWater(200);

		a.dispData();															// main before
		b.dispData();
		System.out.println(" ↓");

		if(! swap(a, b))													// 入れ替え
			System.out.println("False");

		System.out.println(" ↓");								// main after
		a.dispData();
		b.dispData();
	}
}



8.オーバーロード

同じクラスの中で、引数の違う、同じ名前のメソッドが書ける機能。
引数の違いにより別の処理を行わせることが出来る。
例えば、Excelの関数の中には、場合によって引数の数が変わるものが有るが、そんな感じ。
引数の数が違う、或いは、引数の型が違う、が条件で、引数の名前が違うだけではダメ。
コンストラクタもオーバーロード出来る。

コンストラクタをオーバーロードした例。
ビーカーを実体化する際に、
ラベルを省略した場合は、ラベルを「?」、
サイズを省略した場合は、サイズを500mlとする。
水の出し入れの部分は省略。

ビーカー(Beaker_8.java)
//Beaker_8.java      2016.10.13  by Ryn

public class Beaker_8 {

	private String label = "?";
	private int size = 500;
	private int water = 0;

	public Beaker_8(String label, int size) { // コンストラクタ
		this.label = label;
		this.size = size;
	}

	public Beaker_8(String label) {           // コンストラクタのオーバーロード
		this.label = label;
	}

	public Beaker_8(int size) {
		this.size = size;
	}

	public Beaker_8() {
	}


	public void dispData() {
		System.out.printf("label[ %-6s ] size = %4dml / water = %4dml¥n",
																											label, size, water);
	}
}

科学者(Scientist_8.java)
//Scientist_8.java     2016.10.13  by Ryn

public class Scientist_8 {

	public static void main(String[] args) {

		Beaker_8   a = new Beaker_8();
		Beaker_8   b = new Beaker_8("Red");
		Beaker_8   c = new Beaker_8(350);
		Beaker_8   d = new Beaker_8("Green",720);

		a.dispData();
		b.dispData();
		c.dispData();
		d.dispData();
	}
}



9.クラスの配列

ビーカーを配列にして、4つ実体化した。
水の出し入れの部分は省略。

ビーカー(Beaker_8.java)
オーバーロードのものと同じ。
// Beacker_8.java			2016.10.13	by Ryn

public class Beaker_8 {

	private String label = "?";
	private int size = 500;
	private int water = 0;

	public Beaker_8(String label, int size) {		// コンストラクタ
		this.label = label;
		this.size = size;
	}

	public Beaker_8(String label) {           // コンストラクタのオーバーロード
		this.label = label;
	}

	public Beaker_8(int size) {
		this.size = size;
	}

	public Beaker_8() {
	}


	public void dispData() {
		System.out.printf("label[ %-6s ] size = %4dml / water = %4dml¥n",
																											label, size, water);
	}
}

科学者(Scientist_9.java)
// Scientist_9.java			2016.10.13	by Ryn

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

		Beaker_8   a[] = new Beaker_8[4];

		a[0] = new Beaker_8();
		a[1] = new Beaker_8("Red");
		a[2] = new Beaker_8(350);
		a[3] = new Beaker_8("Green",720);
		
		for(int i = 0; i < 4; i++)
			a[i].dispData();
	}
}


参考2:配列は参照型+クラスは参照型
Scientist_9.java の7~9行目は、細かく書くと、以下の様になる。
		Beaker_8   a[];
		a = new Beaker_8[4];

		a[0] = new Beaker_8();
1行目
   a[]
  -+----+-
   |addr| ←Beaker_8クラスの配列 a の各要素へのポインタの為の配列の
  -+----+-           先頭アドレスを記憶する為のメモリ領域を確保
    ↑
2行目 ↑
   a[0] a[1] a[2] a[3]
  -+----+----+----+----+-
   |addr|NULL|NULL|NULL|  ← 配列 a の Beaker_8クラスの各要素の
  -+----+----+----+----+-    先頭アドレスを記憶する為のメモリ領域を確保
    ↑
4行目 ↑
      a[0].label a[0].size  a[0].water
    -+----------+----------+----------+-
     | addr     |      500 |        0 | ← a[0]の為のメモリ領域を、
    -+----------+----------+----------+-    Beaker_8クラスに必要な大きさで確保
       ↑
       ↑
      a[0].label のメモリ領域の先頭アドレス(String は参照型=文字列は長さが不定なので)











[ 黒板消しとチョーク受けの画像 ]