今回はクラスの部品の一つである「フィールド」の説明です。
もくじ
フィールドとは
フィールドは簡単に言えば変数です。「メンバ変数」とも呼ばれます。フィールドはクラス内の状態を担当する部品で、クラス(またはインスタンス)の状態を保存する役割を担います。
ただし、第3章までで作成した変数はフィールドとは区別されます。第3章までの変数はメソッド内で宣言されており、フィールドはメソッド外で宣言された変数です。
フィールドとローカル変数 サンプルプログラム
以下のプログラムを「VarTest.java」という名前でworkフォルダ内に保存します。
保存が完了したら、コマンドプロンプトを起動し、コンパイルを行ってみましょう。
1 2 3 4 5 6 7 8 9 10 |
class VarTest{ //フィールド String a = "フィールド"; //メソッド void test(){ //ローカル変数 String b = "ローカル変数"; } } |
実行例
C:\work>javac VarTest.java
※実行例はコンパイルの例を表示しています。
フィールドとローカル変数
前述の通り、フィールドはメソッドの外で宣言された変数で、ローカル変数はメソッドの中で宣言された変数となります。
フィールドとローカル変数はそれぞれ別の変数として区別して扱う必要があります。今回はフィールドとローカル変数の違いや特徴は一部のみ紹介します。
- アクセス修飾子
- スコープ
- 変数名が同一の場合
- 初期値
アクセス修飾子
フィールドにはローカル変数と違い「アクセス修飾子」を付ける必要があります。※他にもstaticなども付与できます。
フィールドの宣言 | アクセス修飾子 型 変数名 ; |
---|---|
記述例 | private int number ; |
アクセス修飾子には以下の4種類があります。それぞれの種類の特徴や役割は別の記事で紹介します。
- public
- 修飾子なし
- protected
- private
Javaでは基本的にフィールドにはアクセス修飾子「private」を付けるのですが、今回はつけません。(privateについてはカプセル化の項目で説明します)
また、クラス「VarTest」内のフィールドはアクセス修飾子の記述はありませんが、「修飾子なし」という種類に該当します。
1 2 |
//フィールド String a = "フィールド"; |
スコープ
変数が利用できる範囲であるスコープも変わります。スコープは{}の範囲となりますので、フィールドが利用できる範囲はクラス全体、ローカル変数は宣言された該当メソッドのみとなります。
プログラム「VarTest.java」を以下のように編集し、保存しましょう。
(print()メソッドの追加)
保存が完了したら、コマンドプロンプトを起動し、コンパイルを行ってみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class VarTest{ //フィールド String a = "フィールド"; //メソッド void test(){ //ローカル変数 String b = "ローカル変数"; } //メソッド void print(){ System.out.println(a);//フィールドの参照 System.out.println(b);//ローカル変数の参照 } } |
実行例
C:\work>javac VarTest.java
VarTest.java:14: エラー: シンボルを見つけられません
System.out.println(b);//ローカル変数の参照
^
シンボル: 変数 b
場所: クラス VarTest
エラー1個
※実行例はコンパイルの例を表示しています。
VarTest.javaの補足
VarTestの編集後はprint()メソッドが追加されています。
フィールドである変数aは問題ありませんが、ローカル変数である変数bはtest()メソッド内では利用できますが、print()メソッドでは利用できなくなってしまい、コンパイルエラーとなります。
上記図のようにローカル変数であるbはtest()メソッド内でのみ利用でき、print()メソッドでは利用できません。
変数名が同一の場合
フィールドとローカル変数は別扱いとして扱われる為、フィールドとローカル変数で同じ名前の変数名を宣言することが可能です。
プログラム「VarTest.java」を以下のように編集し、保存しましょう。
(test()メソッドとprint()メソッドの編集)
保存が完了したら、コマンドプロンプトを起動し、コンパイルを行ってみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class VarTest{ //フィールド String a = "フィールド"; //メソッド void test(){ //ローカル変数 String b = "ローカル変数"; //ローカル変数 String a = "ローカル変数"; System.out.println(a);//ローカル変数の参照 } //メソッド void print(){ System.out.println(a);//フィールドの参照 //コンパイルエラーのため、コメントアウト //System.out.println(b);//ローカル変数の参照 } } |
実行例
C:\work>javac VarTest.java
※実行例はコンパイルの例を表示しています。
VarTest.javaの補足
VarTestの編集後は3つの変数が宣言されています。
//フィールド
String a = “フィールド”;
//メソッド
void test(){
□□//ローカル変数
□□String b = “ローカル変数”;
□□//ローカル変数
□□String a = “ローカル変数”;
□□System.out.println(a);//ローカル変数の参照
}
aという変数が2か所で宣言されていますが、コンパイルエラーにはなりません。フィールドとローカル変数は区別される為、別変数と扱われます。
test()メソッド内でaという変数の表示を行っていますが、ローカル変数が利用されます。もし、フィールドとローカル変数で同一名を利用し、かつフィールドを利用したい場合は「this.変数名」と記述することで利用が可能です。
※混乱しそうな場合はフィールドとローカル変数では別の変数名を利用しましょう
※thisについては別記事で紹介
フィールドの初期値
ローカル変数は定義後、変数の初期化を行うことにより、データが初めて代入されます。ローカル変数では初期化を行わず参照を行うとコンパイルエラーとなります。
int number ; //宣言のみ
System.out.println(number) ; //データが代入されておらず、コンパイルエラー
フィールドは宣言を行うだけで自動的に初期値が設定されます。
1 2 |
//宣言のみ String a ; |
初期値は宣言した型によって異なります。初期値は以下のように設定されます。
型 | 初期値 |
---|---|
数値 | 0 |
boolean | false |
配列 | null |
Stringなどのクラス | null |
別クラスからフィールド利用
別クラスからフィールドへのデータ格納および参照を行うには「インスタンス変数名.フィールド名」と記述します。
別クラスからのフィールド利用 | インスタンス変数名.フィールド名 ; |
---|---|
記述例 | Sample sample = new Sample() ; sample.name = “サンプル” ; System.out.println(sample.name) ; |
記述例では、インスタンス変数を作成した後、「nameフィールドにデータ格納」と「nameフィールドの参照」を行っています。
別クラスからのフィールド利用 サンプルプログラム
以下のプログラムを「Number26.java」という名前でworkフォルダ内に保存します。
保存が完了したら、コマンドプロンプトを起動し、コンパイルおよび実行を行ってみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 |
class Number26{ public static void main(String[] args){ //VarTestクラスからインスタンスを生成 VarTest vt = new VarTest(); //メソッドの利用 vt.print(); //フィールドにデータを設定 vt.a = "上書き"; vt.print(); } } |
実行例
C:\work>java Number26.java
C:\work>java Number26
フィールド
上書き
コンパイルおよび実行例です。
フィールド 復習問題
- 以下の説明で誤りの記述を選んでください。
- フィールドに付けるアクセス修飾子として誤りの記述を選んでください。
- クラスAからインスタンス変数aを作成し、定義されているフィールドxを利用する際の記述として正しいものを選んで下さい。
- お疲れ様でした。
-
- フィールドとローカル変数は同一名を付けることができる
- フィールドはメソッドの外で宣言された変数である
- ローカル変数はメソッドの中で宣言された変数である
- ローカル変数にはアクセス修飾子を付けることができる
-
- public
- private
- protected
- native
-
System.out.println(A x)
System.out.println(a x)
System.out.println(A.x)
System.out.println(a.x)
まとめ
- フィールドはメソッドの外で宣言された変数
- フィールドは状態を担当する
- メソッドの中で宣言された変数はローカル変数と呼ばれる
- フィールドにはアクセス修飾子を付ける
- フィールドとローカル変数は区別される
- フィールドとローカル変数は同一の名前を付けることが可能