#acl All:
== ここまでのまとめ ==
 . Javaプログラムはバーチャルマシン上で実行される。
 . Javaバイトコードは実行する環境が変わっても共通である。
 . Javaのプログラムはクラスの記述である。
----
=== クラス ===
 . クラスはオブジェクトの'''状態'''と'''動作'''をサポートする。
 . オブジェクトの状態は'''属性'''の集まりとして表される。
 . オブジェクトの動作は'''メソッド'''で記述される。

クラスの記述(プログラム)は次のような形式になる。
5つの項目があるが、必要なものだけ記述すればよい。

それぞれ修飾子をつけることができる。

 {{{
 public class クラス名
 {
     static変数の宣言
     属性の宣言
     コンストラクタの定義
     普通のメソッドの定義
     staticメソッドの定義
 }
 }}}
----
=== メソッド ===
----
=== static変数 ===
static修飾子のついた変数宣言。

static変数はクラス内に共通にとられる。

----
=== 属性 ===
static修飾子のつかない変数宣言。

この変数は個々のインスタンス内にとられる。

他から参照するには
 インスタンス.変数名
の形式で書く。

そのクラスのメソッド内では
 this.変数名
の形式になる。
ただし、混乱の可能性が無ければthis.は省略できる。

 {{{#!java
 public class Point
 {
 	double x;
 	double y;
 	
 	double kyori()
 	{
 		return Math.sqrt( x*x + y*y );
 	}
 	
 	public static void main(String[] args)
 	{
 		Point a = new Point();
 		a.x = 3.0;
 		a.y = 4.0;
 		System.out.println( a.kyori() );
 	}
 }
 }}}

----
=== コンストラクタ ===
コンストラクタはクラス名と同じ名前で後ろに()がつく。

引数の型や個数が異なればいくつでも定義できる。

----
=== 普通のメソッド ===
static修飾子のつかないメソッド。

メソッドの呼び出しは
 インスタンス.メソッド(引数)
の形式で書く。
引数は無いときもあるし、複数のときもある。

メソッド内では、呼び出しもとのインスタンスはthisで参照できる。

----
=== staticメソッド ===
static修飾子のついたメソッド。

他のクラスから呼び出すときは
 クラス名.メソッド(引数)
の形式で書く。

== static変数 ==

static変数(静的変数)はクラス内に取られる変数で、
そのクラスのインスタンスから共通のものとして扱うことができます。

----
=== 例 ===

Takoyakiクラスにはkosuとajiの2つの変数があります。

 {{{#!java
 public class Takoyaki
 {
 	static int kosu;
 	String aji;
 	
 	Takoyaki(String a)
 	{
 		aji = a;
 	}
 	
 	public static void main(String[] args)
 	{
 		new Takoyaki("ソース");
 		new Takoyaki("しょうゆ");
 	}
 }
 }}}

ajiはインスタンスの属性であり、
インスタンス内に変数が取られます。

一方static修飾子がつけられた変数kosuはクラス内に取られます。

図で示すとこのようになります。
クラス内に点線で囲まれた変数はインスタンスの型紙として用いられるだけで、
ここに変数が取られるわけではありません。

 {{attachment:static1.png}}

この変数を使ってTakoyakiインスタンスが作られた個数を数えることができます。

 . 変数宣言のところで値を0に初期化しておきます。
 . コンストラクタが呼ばれたらkosuを1増やします。

いくつかコンストラクタを呼び出した後、変数kosuの値を出力して確かめることができます。

 {{{#!java
 public class Takoyaki
 {
 	static int kosu = 0;
 	String aji;
 	
 	Takoyaki(String a)
 	{
 		kosu++;
 		aji = a;
 	}
 	
 	public static void main(String[] args)
 	{
 		new Takoyaki("ソース");
 		new Takoyaki("しょうゆ");
 		System.out.println( kosu );
 	}
 }
 }}}