プリミティブ型変数
C言語をはじめとするほとんどの言語で整数の四則演算や比較演算を行うことができるように、Javaでも整数等の四則演算や比較演算を行うことができます。
プリミティブ型
プリミティブ型(基本型)とは、整数型(int)や浮動小数型(float)などのように基本的なデータを扱う型であり、クラスではありません。
例えばJavaで整数型の宣言と演算を書けば次のようになります。
// 変数xの宣言と初期値30の代入 int x = 30; int y = 16; // 演算 int z = x + y - 10;
このようにプリミティブ型(基本型)はクラス名とは異なり先頭が小文字で始まります。
また、クラスではない為にnew演算子を使ってインスタンスを生成しません。
変数の宣言
プリミティブ型の変数を宣言すると、メモリ上に領域が直ちに確保されます。
この時、代入を同時に行っていないならばデフォルト値(通常は0)の代入が自動的に行われます。
// int型変数xの宣言 int x; // 以下のように書いたことと同じとなる int x = 0;
初期値の代入はコンパイラが自動的に補完する為に省略可能ですが、原則としては宣言と同時に初期化を行うべきです。
繰り返しますが、プリミティブ型はクラスではない為にインスタンスを生成しない事に注意してください。
ローカル変数
メソッド内で宣言される変数はローカル変数と呼ばれ、メソッドを抜けるまで有効な変数です。
同じインスタンスのメソッドが複数回呼ばれたとしても、ローカル変数はその都度に初期化され破棄されます。
// メソッドが呼ばれる度にaは10で初期化される為、戻り値は常に15となる int method() { int a = 10; a = a + 5; return a; }
mainメソッドの中で宣言される変数もローカル変数です。
インスタンス変数
クラスに定義された変数をインスタンス変数と呼び、インスタンスが生成される時に、インスタンスごとにメモリ領域が確保されます。
これはC言語の構造体のメンバと似た概念である為、メンバ変数とも呼ばれることもあります。
次のコードはインスタンス変数を用いたタクシー料金シミュレートクラスです。
[CabFare.java]
package example03; public class CabFare { // 料金 int fare = 580; // コンストラクタ CabFare() { } // 料金加算メソッド void incrementFare() { fare = fare + 80; } }
[Example03.java]
package example03; public class Example03 { public static void main(String[] args) { CabFare cabFare = new CabFare(); System.out.println("初乗り料金"); System.out.println(cabFare.fare); System.out.println("メーターがあがった!"); cabFare.incrementFare(); System.out.println(cabFare.fare); System.out.println("メーターがあがった!"); cabFare.incrementFare(); System.out.println(cabFare.fare); System.out.println("メーターがあがった!"); cabFare.incrementFare(); System.out.println(cabFare.fare); System.out.println("メーターがあがった!"); cabFare.incrementFare(); System.out.println(cabFare.fare); } }
CabFare(タクシー料金)クラスには、コンストラクタ、int型のインスタンス変数fare、メソッドincrementFare(料金増加)が定義されています。
このような図をクラス図と呼びます。
上からクラス名、インスタンス変数(変数名: 型で記述)、メソッド(メソッド名: 戻り値の型)と記述するルールになっており、実装(メソッドの中身)に関しては記述しません。
クラス図を使えばクラスの概要をプログラムのソースを読まなくとも把握でき、クラスを設計する時によく使われますので、なによりも読める事が重要です。
では、mainメソッドの中を見ていきましょう。
CabFare cabFare = new CabFare();
CabFareクラスのインスタンスを生成し、cabFareという変数に(インスタンスへの参照を)代入しています。
このようにクラスの変数名はクラス名をキャメルケースで記述すると最も単純で解りやすくなります。
尚、クラス名が長い時など省略して後半のみを使うこともよくあります。
CabFare fare = new CabFare();
ただし、意味の無い変数名や誤解を招くような変数名はコードを読みにくくするので避けるべきです。
[意味のない変数名の例]
// aでは何の変数か解らない CabFare a = new CabFare(); // aってどんなインスタンスだろう? もしくはプリミティブ型? a.incrementFare();
[誤解を招く変数名の例]
// CabFare(タクシー料金)とapple(りんご)にはなんの関連も無い CabFare apple = new CabFare(); // "りんご"の"料金増加"? 解らないどころか混乱の元 apple.incrementFare();
また、CabFareであればcfのように頭文字をとって記述する場合がありますが、一般的な省略形でない限りは極力避ける方が良いでしょう。
メソッドと同じように、インスタンス変数には「変数(インスタンス)+ .(ドット演算子) + 変数名」という形でアクセスできます。
// CabFareのインスタンスに対して変数fareを取得
cabFare.fare;
これはC言語の構造体の時と同じです。
fareには初期値として580が代入されているのでcabFare.fareと書けば580が取得できます。
尚、JavaのSystem.out.println文では直接整数などを出力することができます。
次の行ではCabFareインスタンスのincrementFareメソッドを呼び出しています。
cabFare.incrementFare();
incrementFareメソッドでは、インスタンス変数fareに対して元の値に80を足した値を代入しています。
void incrementFare() { fare = fare + 80; }
このメソッドが呼び出される事でインスタンスに格納されているfareの値が80増加します。
System.out.println(cabFare.fare);
よってここでcabFare.fareは80増加した値となります。
この後、再びincrementFareが呼ばれ、更に80が足され・・・とプログラムは実行されていきます。