Developer

【はじめてのJava】同名の変数5【オブジェクトとクラス編】
2021.11.30
Lv1

【はじめてのJava】同名の変数5【オブジェクトとクラス編】

はじめてのJava

このシリーズでは、初めてJavaやプログラミングを勉強する方向けに、Javaによるプログラミングの基礎を説明していきます。
目標レベルは、Javaの資格試験の一つである「Oracle Certified Java Programmer, Silver」(通称Java Silver)に合格できる程度の知識の習得です。
はじめてJavaやプログラムに触れる方にもできるだけわかりやすい解説を心がけていきます。


オブジェクトとクラス編

オブジェクトとクラス編では、Javaを扱う上で非常によく出てくる「オブジェクト」や「クラス」について扱っていきます。

前回は「同名のインスタンス変数とローカル変数を同名にする利点」について扱いました。

今回は「同名の変数(static変数とローカル変数の場合)」について紹介します。


目次


変数のスコープ

 変数のスコープ とはその変数を利用可能な範囲のことです。

以前紹介したように「インスタンス変数」「static変数」「ローカル変数」では、変数のスコープが異なります。
では、もしも「インスタンス変数」「static変数」「ローカル変数」が同名だった場合はどうなるのでしょうか。

詳しく見ていきましょう。


同名のstatic変数とローカル変数

前回、インスタンス変数とローカル変数は同名で定義可能だと説明しました。では、static変数とインスタンス変数の場合はどうでしょうか。

static変数も、クラス内ならどこでも利用可能な変数ですが、それに対してローカル変数は宣言されたメソッドブロック内の、宣言位置よりも下でのみ利用可能な変数です。

また、static変数は、 クラス名.変数名 とすることで明示的に指定できます。そのため、同名のstatic変数とローカル変数を定義することは可能です。

具体例でみていきましょう。


具体例

以下は、Sampleクラスにインスタンス変数とローカル変数を定義しています。2つの変数ともにnumという変数名で定義しています。

Sampleクラス

public class Sample{
  static int num = 2;
  void method(){
    int num = 3;
    System.out.println(num); //ローカル変数の方なので3
    System.out.println(Sample.num); //static変数の方なので2
  }
}

こちらもインスタンス変数とローカル変数の時と同様、 コンパイル可能 です。

下記のようにmainメソッドを持ったクラスを作成して動作を確認してみると、numの方はローカル変数を、Sample.numの方はstatic変数を呼び出していることが分かります。

SampleMainクラス

public class SampleMain{
  public static void main(String[] args){
    Sample s = new Sample();
    s.method();
  }
}

実行結果は以下の通りです。

これで、static変数とローカル変数を同名で定義可能なことが分かりました。


ソースコード

今回使用したソースコードをまとめて記載します。2つのソースコードは同じディレクトリに配置する必要があります。

Sampleクラス

public class Sample{
  static int num = 2;
  void method(){
    int num = 3;
    System.out.println(num); //ローカル変数の方なので3
    System.out.println(Sample.num); //static変数の方なので2
  }
}

SampleMainクラス

public class SampleMain{
  public static void main(String[] args){
    Sample s = new Sample();
    s.method();
  }
}

まとめ

static変数とローカル変数は同名で定義可能
同名のstatic変数とローカル変数が同時に使える場合、クラス名.変数名とするとstatic変数の方を指定可能


はじめてのJavaシリーズの目次はこちら
オブジェクトとクラス編はこちら


java 11 の練習問題一覧はこちら
はじめてのJavaシリーズの練習問題一覧はこちら