【はじめてのJava】同名の変数2【オブジェクトとクラス編】
はじめてのJava
このシリーズでは、初めてJavaやプログラミングを勉強する方向けに、Javaによるプログラミングの基礎を説明していきます。
目標レベルは、Javaの資格試験の一つである「Oracle Certified Java Programmer, Silver」(通称Java Silver)に合格できる程度の知識の習得です。
はじめてJavaやプログラムに触れる方にもできるだけわかりやすい解説を心がけていきます。
オブジェクトとクラス編
オブジェクトとクラス編では、Javaを扱う上で非常によく出てくる「オブジェクト」や「クラス」について扱っていきます。
前回は「同名の変数(インスタンス変数とstatic変数の場合)」について扱いました。
今回は「同名の変数(インスタンス変数とローカル変数の場合)」について紹介します。
目次
変数のスコープ
変数のスコープ とはその変数を利用可能な範囲のことです。以前紹介したように「インスタンス変数」「static変数」「ローカル変数」では、変数のスコープが異なります。
では、もしも「インスタンス変数」「static変数」「ローカル変数」が同名だった場合はどうなるのでしょうか。
詳しく見ていきましょう。
同名のインスタンス変数とローカル変数
インスタンス変数とローカル変数は 同名にすることが可能 です。
インスタンス変数はクラス内ならどこでも利用可能な変数ですが、それに対してローカル変数は宣言されたメソッドブロック内の、宣言位置よりも下でのみ利用可能な変数です。
一見すると、スコープは違っていても同名で定義することで余計な混乱を呼びそうに思えます。
そこで、具体例を見ながら考えていきましょう。
具体例
以下は、Sampleクラスにインスタンス変数とローカル変数を定義しています。2つの変数ともにnumという変数名で定義しています。
Sampleクラス
public class Sample{ int num = 1; void method(){ int num = 3; } }
一見すると変数名が重複しているように見えますが、これは コンパイル可能 です。コンパイルエラーにはなりません。
ここで一つ疑問が湧いてきます。下記のように、sample()メソッド内でnumを表示した場合、1と3のどちらが表示されるのでしょうか。
Sampleクラス
public class Sample{ int num = 1; void method(){ int num = 3; System.out.println(num); //1? 3? } }
次のようなmainメソッドを持ったクラスを作成し、試してみると3が表示されます
SampleMainクラス
public class SampleMain{ public static void main(String[] args){ Sample s = new Sample(); s.method(); } }
同名のインスタンス変数とローカル変数が同時に使える場合、その変数名で指定できるのはローカル変数の方ということになります。
では、もしインスタンス変数の方を指定したい場合はどうなるのでしょうか。
次回、この続きを確認していきます。
ソースコード
今回使用したソースコードをまとめて記載します。2つのソースコードは同じディレクトリに配置する必要があります。
Sampleクラス
public class Sample{ int num = 1; void method(){ int num = 3; System.out.println(num); //1? 3? } }
SampleMainクラス
public class SampleMain{ public static void main(String[] args){ Sample s = new Sample(); s.method(); } }
まとめ
インスタンス変数とローカル変数は同名で定義可能
同名のインスタンス変数とローカル変数が同時に使える場合、その変数名で指定できるのはローカル変数の方
次回
次回は同名のインスタンス変数とローカル変数の扱いの続きです。
はじめてのJavaシリーズの目次はこちら
オブジェクトとクラス編はこちら