【はじめてのJava】変数のスコープ1(インスタンス変数)【オブジェクトとクラス編】
はじめてのJava
このシリーズでは、初めてJavaやプログラミングを勉強する方向けに、Javaによるプログラミングの基礎を説明していきます。
目標レベルは、Javaの資格試験の一つである「Oracle Certified Java Programmer, Silver」(通称Java Silver)に合格できる程度の知識の習得です。
はじめてJavaやプログラムに触れる方にもできるだけわかりやすい解説を心がけていきます。
オブジェクトとクラス編
オブジェクトとクラス編では、Javaを扱う上で非常によく出てくる「オブジェクト」や「クラス」について扱っていきます。
前回は「ローカル変数の初期値」について扱いました。
今回は「インスタンス変数のスコープ」について紹介します。
目次
変数のスコープ
変数のスコープ とはその変数を利用可能な範囲のことです。変数は宣言したからと言ってすべての箇所で使えるわけではありません。
詳しく見ていきましょう。
インスタンス変数のスコープ
インスタンス変数はインスタンス毎に保持する変数です。
ですので、 インスタンスがあれば利用できます ※。
※他のクラス内で利用する場合はアクセス修飾子も考慮する必要があります。
インスタンスメソッド内では利用できる
インスタンス変数はインスタンス化して初めて実体ができます。
インスタンスメソッドもインスタンス化して初めて利用できるようになります。
ですので、 インスタンス変数はインスタンスメソッド内で利用できます 。
class Sample{ String message; //インスタンス変数 void method(){ //インスタンスメソッド message = "hello"; //OK System.out.println(message); //OK } }
staticメソッド内では利用不可
インスタンス変数はインスタンス毎に保持する変数です。
staticメソッドはインスタンスが無くても利用できるメソッドです
ですので、 インスタンス変数はstaticメソッド内でそのまま使うことはできません 。
staticメソッドはインスタンスが無くても利用可能なため、staticメソッド実行時にインスタンスがあるとは限らないためです。
例えば以下はコンパイルエラーになります。
class Sample{ String message; //インスタンス変数 static void sMethod(){ message = "hello"; //NG。インスタンス化されていないので変数messageの実体が存在しない。 System.out.println(message); //NG(同上) //以下のようにstaticメソッド内でもインスタンス化してからなら利用できる //Sample s = new Sample(); //s.message = "hello"; //OK //System.out.println(s.message); //OK } }
宣言位置より前でも利用可能
インスタンス変数は宣言位置よりも前でも利用可能です。
例えば、ややこしいですが、以下のように、クラスの一番最後でインスタンス変数を宣言し、宣言よりも上にあるインスタンスメソッド内で利用してもコンパイルエラーにはなりません。
(ややこしくなるので、クラスの一番最初の部分で宣言することをお勧めします。)
class Sample{ void method(){ message = "hello"; //変数の宣言箇所より前だが利用可能 System.out.println(message); } String message; //インスタンス変数 }
ほかのクラス内での利用
インスタンス変数を他のクラス内で利用できるようにするためには適切にアクセス修飾子を設定する必要があります。
詳しくはアクセス修飾子の記事を参照してください。
まとめ
インスタンス変数はインスタンス化すれば利用できる
インスタンス変数はstaticメソッド内ではそのまま利用することはできない
(staticメソッド内でインスタンス化すれば利用可能)
インスタンス変数を他のクラス内で利用できるようにするためには適切にアクセス修飾子を設定する必要がある
次回
次回はstatic変数のスコープについて扱います。
はじめてのJavaシリーズの目次はこちら
オブジェクトとクラス編はこちら