Developer

【はじめてのJava】変数のスコープ2(static変数)【オブジェクトとクラス編】
2021.10.31
Lv1

【はじめてのJava】変数のスコープ2(static変数)【オブジェクトとクラス編】

はじめてのJava

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


オブジェクトとクラス編

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

前回は「インスタンス変数のスコープ」について扱いました。

今回は「static変数のスコープ」について紹介します。


目次


変数のスコープ

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

変数は宣言したからと言ってすべての箇所で使えるわけではありません。

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


static変数のスコープ

static変数はクラス全体で共通の変数です。
ですので そのクラスが利用できれば、どこでも利用できます ※。

※他のクラス内で利用する場合はアクセス修飾子も考慮する必要があります。


インスタンスメソッド内で利用できる

static変数はクラスが利用できれば利用できます
ですので、 static変数はインスタンスメソッド内で利用できます 

class Sample{
  static String message; //static変数
  void method(){ //インスタンスメソッド
    message = "hello"; //OK
    System.out.println(message); //OK
  }
}

【おまけ】可読性などを考慮すると、本来は以下のようにSample.messageと書くべきです。

class Sample{
  static String message;
  void method(){
    Sample.message = "hello"; //ここ
    System.out.println(Sample.message); //ここ
  }
}

staticメソッド内でも利用可能

static変数はクラスが使えれば利用可能な変数です。
staticメソッドもクラスが使えれば利用可能なメソッドです。
ですので、 static変数はstaticメソッド内でも利用できます 

class Sample{
  static String message; //static変数
  static void sMethod(){ //staticメソッド

    message = "hello"; //OK
    System.out.println(message); //OK
  }
}

宣言位置より前でも利用可能

static変数も宣言よりも前でも利用可能です。

例えば、ややこしいですが、以下のように、クラスの一番最後でstatic変数を宣言し、宣言よりも上にあるメソッド内で利用してもコンパイルエラーにはなりません
(ややこしくなるので、クラスの一番最初の部分で宣言することをお勧めします。)

class Sample{
  void method(){
    message = "hello"; //OK。変数の宣言箇所より前だが利用可能。
    System.out.println(message);
  }
  static String message; //static変数
}

ほかのクラス内での利用

static変数も、他のクラス内で利用できるようにするためには適切にアクセス修飾子を設定する必要があります

詳しくはアクセス修飾子の記事を参照してください。



まとめ

static変数はクラスが利用できれば利用できる
static変数はstaticメソッド内でも利用できる
static変数を他のクラス内で利用できるようにするためには適切にアクセス修飾子を設定する必要がある

次回

次回はローカル変数のスコープについて扱います。


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


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