Javaとオブジェクト指向 フィールド(4-3)

記事上広告

今回はクラスの部品の一つである「フィールド」の説明です。

フィールドとは

フィールドは簡単に言えば変数です。「メンバ変数」とも呼ばれます。フィールドはクラス内の状態を担当する部品で、クラス(またはインスタンス)の状態を保存する役割を担います。

ただし、第3章までで作成した変数はフィールドとは区別されます。第3章までの変数はメソッド内で宣言されており、フィールドはメソッド外で宣言された変数です

フィールドとローカル変数 サンプルプログラム

以下のプログラムを「VarTest.java」という名前でworkフォルダ内に保存します。
保存が完了したら、コマンドプロンプトを起動し、コンパイルを行ってみましょう。

実行例

C:\work>javac VarTest.java

※実行例はコンパイルの例を表示しています。

フィールドとローカル変数

前述の通り、フィールドはメソッドの外で宣言された変数で、ローカル変数はメソッドの中で宣言された変数となります。

フィールドとローカル変数はそれぞれ別の変数として区別して扱う必要があります。今回はフィールドとローカル変数の違いや特徴は一部のみ紹介します。

  • アクセス修飾子
  • スコープ
  • 変数名が同一の場合
  • 初期値

アクセス修飾子

フィールドにはローカル変数と違い「アクセス修飾子」を付ける必要があります。※他にもstaticなども付与できます。

フィールドの宣言 アクセス修飾子 型 変数名 ;
記述例  private int number ;

アクセス修飾子には以下の4種類があります。それぞれの種類の特徴や役割は別の記事で紹介します。

  • public
  • 修飾子なし
  • protected
  • private

Javaでは基本的にフィールドにはアクセス修飾子「private」を付けるのですが、今回はつけません。(privateについてはカプセル化の項目で説明します)

また、クラス「VarTest」内のフィールドはアクセス修飾子の記述はありませんが、「修飾子なし」という種類に該当します。

スコープ

変数が利用できる範囲であるスコープも変わります。スコープは{}の範囲となりますので、フィールドが利用できる範囲はクラス全体、ローカル変数は宣言された該当メソッドのみとなります。

プログラム「VarTest.java」を以下のように編集し、保存しましょう。
(print()メソッドの追加)
保存が完了したら、コマンドプロンプトを起動し、コンパイルを行ってみましょう。

実行例

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()メソッドの編集)
保存が完了したら、コマンドプロンプトを起動し、コンパイルを行ってみましょう。

実行例

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) ; //データが代入されておらず、コンパイルエラー

フィールドは宣言を行うだけで自動的に初期値が設定されます。

初期値は宣言した型によって異なります。初期値は以下のように設定されます。

初期値
数値 0
boolean false
配列 null
Stringなどのクラス null

別クラスからフィールド利用

別クラスからフィールドへのデータ格納および参照を行うには「インスタンス変数名.フィールド名」と記述します。

別クラスからのフィールド利用 インスタンス変数名.フィールド名 ;
記述例 Sample sample = new Sample() ;
sample.name = “サンプル” ;
System.out.println(sample.name) ;

記述例では、インスタンス変数を作成した後、「nameフィールドにデータ格納」と「nameフィールドの参照」を行っています。

別クラスからのフィールド利用 サンプルプログラム

以下のプログラムを「Number26.java」という名前でworkフォルダ内に保存します。
保存が完了したら、コマンドプロンプトを起動し、コンパイルおよび実行を行ってみましょう。

実行例

C:\work>java Number26.java

C:\work>java Number26
フィールド
上書き

コンパイルおよび実行例です。

フィールド 復習問題

問題
  • 以下の説明で誤りの記述を選んでください。
  • フィールドに付けるアクセス修飾子として誤りの記述を選んでください。
  • クラスAからインスタンス変数aを作成し、定義されているフィールドxを利用する際の記述として正しいものを選んで下さい。
  • お疲れ様でした。
解答群
    1. フィールドとローカル変数は同一名を付けることができる
    2. フィールドはメソッドの外で宣言された変数である
    3. ローカル変数はメソッドの中で宣言された変数である
    4. ローカル変数にはアクセス修飾子を付けることができる
    1. public
    2. private
    3. protected
    4. native
    1. System.out.println(A x)
    2. System.out.println(a x)
    3. System.out.println(A.x)
    4. System.out.println(a.x)

まとめ

  • フィールドはメソッドの外で宣言された変数
  • フィールドは状態を担当する
  • メソッドの中で宣言された変数はローカル変数と呼ばれる
  • フィールドにはアクセス修飾子を付ける
  • フィールドとローカル変数は区別される
  • フィールドとローカル変数は同一の名前を付けることが可能
スポンサーリンク
レクタングル