Head First Java 第2版――頭とからだで覚えるJavaの基本 その2

オブジェクト指向

クラスを作る際に考えるべきこと
・クラスに対応する物や事に必要な[情報]は何か?
・クラスに対応する物や事が果たすべき[機能]は何か?

class ShoppingCart {

cartContents //情報
addToCart() //機能

}

情報のことをインスタンス変数
機能のことを「メソッド」と呼ぶ


■クラスとオブジェクトの違い
クラスはオブジェクトの設計図
ex.buttonクラスがあったとき、その形や色、ラベルなどが異なるbuttonオブジェクトが作られる
クラスとオブジェクトの関係は新品の「アドレス帳」のようなもの


■クラスの作成と使用
クラスを使用するためにテストをするためのクラスを作る。


■mainから外へ飛び出す
mainメソッドだけを使っているうちはオブジェクト指向プログラミングとは言えません


■mainメソッドの役割
・他のクラスのテスト
Javaアプリケーションの起動

[サンプル]オブジェクト指向を使って数当てゲームを書いてみる

・数当てゲームクラス

/**
 *0~9までの数から無作為に数字が選ばれて、
 *その数字が何かPlayerオブジェクトが予測するゲーム
 */

public class GuessGame {

		//インスタンス変数の宣言
		Player p1;
		Player p2;
		Player p3;

		public void startGame() {

			//Playerオブジェクトを作成する
			p1 = new Player();
			p2 = new Player();
			p3 = new Player();

			//playerが予測した数字を代入する変数
			int guessp1 = 0;
			int guessp2 = 0;
			int guessp3 = 0;

			//正解フラグ
			boolean p1isRight = false;
			boolean p2isRight = false;
			boolean p3isRight = false;

			//無造作に数字を選ぶ
			int targetNumber = (int) (Math.random() * 10);
			System.out.println("I'm thinking of a number between 0 and 9...");

			while(true) {

				System.out.println("Number to guess is " + targetNumber);

				//Playerオブジェクトのguess()メソッドを呼び出す
				p1.guess();
				p2.guess();
				p3.guess();

				//Playerの予測した数字を取得する
				guessp1 = p1.number;
				System.out.println("Player one guessed " + guessp1);

				guessp2 = p2.number;
				System.out.println("Player two guessed " + guessp2);

				guessp3 = p2.number;
				System.out.println("Player two guessed " + guessp3);

				//Playerオブジェクトの予想した数字と、無作為に選ばれた数字を比較する
				//正しければ正解フラグをtrueにする
				if (guessp1 == targetNumber) {
					p1isRight = true;
				}
				if (guessp2 == targetNumber) {
					p2isRight = true;
				}
				if (guessp3 == targetNumber) {
					p3isRight = true;
				}

				//いずれかのPlayerオブジェクトの予測が正しければ以下の処理が実行される
				if (p1isRight || p2isRight || p3isRight) {

					System.out.println("We have a winner!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
					System.out.println("Player one got it right? " + p1isRight);
					System.out.println("Player two got it right? " + p2isRight);
					System.out.println("Player three got it right? " + p3isRight);
					System.out.println("Game is over.");
					break;
				} else {
					System.out.println("Player will have to try again.");
				}

			}

		}
}

・Playerクラス

public class Player {

	//予測した数字が入る
	int number =0;

	public void guess() {
		number = (int) (Math.random() * 10);
		System.out.println("I'm guessing " + number);
	}

}

・テストクラス

public class GameLauncher {
	public static void main(String[] args) {
		GuessGame game = new GuessGame();
		game.startGame();
	}
}


■ガーベージコレクション
今後使われることのないと判断されたオブジェクトをゴミとして処理する

■素朴な疑問
Javaにはグローバル変数が存在しないの?
public staticや public static final することでグローバル変数ぽくなります
・それってオブジェクト指向なの?
結局なんらかのクラスがもってる変数を参照しているからオブジェクト指向
Javaのプログラムは結局クラスの集まりということ?
そうです
・クラスの数が膨大になったら?
.jarファイルにまとめます。マニフェストと呼ばれるテキストファイルににどのクラスがmain()メソッドを持っているかという情報を持っています。

■重要ポイント
1.オブジェクト指向プログラミングでは既存のコードに手を付けずにプログラムを拡張することができる
2.Javaプログラムのコードは必ずいずれかのクラスに属する
3.クラスはオブジェクトを作るための設計図のようなもの
4.オブジェクトを利用する際、中の仕組みがどのようになっているかを知る必要はない。仕方と結果だけわかればよい。
5.クラスには情報と機能を持たせる
6.クラスの持つ情報を「インスタンス変数」と呼ぶ
7.クラスの持つ機能を「メソッド」と呼ぶ
8.クラスをテストするには別のクラスから呼び出してみる。(オブジェクトを生成する)
9.クラスは他のクラスから変数やメソッドを使いまわせる(継承)
10.Javaプログラムは「オブジェクトのやりとり」で成り立っている