Developer

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

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

はじめてのJava

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


オブジェクトとクラス編

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

前回は「同名の変数(インスタンス変数とローカル変数の場合)」について扱いました。

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


目次


変数のスコープ

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

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

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


同名のインスタンス変数とローカル変数

前回説明した通り、インスタンス変数とローカル変数は同名で定義可能です。
同名のインスタンス変数とローカル変数が同時に使える場合、その変数名で指定できるのはローカル変数の方になります。

では、インスタンス変数の方を指定したい場合はどうすればいいのでしょうか。


thisを使って指定する

変数を指定する際に this.変数名 とすることで明示的にインスタンス変数を指定することができます。

これを利用すれば、同名のインスタンス変数とローカル変数が同時に使える場合でも、インスタンス変数の方を指定することが可能です。

サンプルで確認してみましょう。サンプルソースは以下の通りです。

Sampleクラス

public class Sample{
  int num = 1;
  void method(){
    int num = 3;
    System.out.println(num); //ローカル変数の方なので3
    System.out.println(this.num); //インスタンス変数の方なので1
  }
}

SampleMainクラス

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

上記のソースコードを同じディレクトリに保存し、コンパイル、実行すると以下のようになります。

このように、thisを使えば同名のローカル変数が存在する場合でも、インスタンス変数の方を指定することができます。


ソースコード

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

Sampleクラス

public class Sample{
  int num = 1;
  void method(){
    int num = 3;
    System.out.println(num); //ローカル変数の方なので3
    System.out.println(this.num); //インスタンス変数の方なので1
  }
}

SampleMainクラス

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

まとめ

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

次回

これで同名のインスタンス変数とローカル変数を定義できることが分かりました。しかし、同名で定義する必要はあるのでしょうか。

次回は同名のインスタンス変数とローカル変数を定義する利点について考えます。


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


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