【Java】staticについて(staticメソッド・static変数・staticイニシャライザについて解説)

【Java】staticについて(staticメソッド・statiフィールド・static変数について解説)

「static」は「静的な」や「変化がない」などに翻訳されます。

Javaでstaticの名称が付いた用語で「staticメソッド」や「staticフィールド」「static変数」「static領域」や「staticイニシャライザ」等などたくさんあります。

staticについて解説します。

Javaでstaticで修飾できるものについて

static」で修飾できるものについては、以下のようなものがあります。

📝「static」で修飾できるもの
・メソッド
・フィールド
・変数

 

staticで修飾されたものについてはフィールドやメソッドについて、「static領域」と呼ばれる領域に配置されます。それ以外については「ヒープ領域」に配置されます。

staticで修飾されたものについてはインスタンスを作る定義とは別の領域に配置されているため、

インスタンスを作らなくても使える」という特徴(及びメリット)があります。

staticメソッド

メソッド名の前に「static」がついたものを「staticメソッド」と言います。

staticメソッドのについての構文や記載例は次のようになります。

📝staticなメソッド 構文

アクセス修飾子 static 戻り値型 メソッド名(引数の型 引数名) {
    //メソッド内での処理内容
}
📋メリット
インスタンスを作らなくても使用できる
📒記載例
public static String テスト値(String test) {
  if (test.equals(“”)) {
    test = “カラ”;
  } else {
    test = “空でない”;
  }
  return test;
}
📋補足
※アクセス修飾子の前に記載があってもエラーとならないが、それ以外の箇所にstaticを記入する場合はエラー
static アクセス修飾子 戻り値型 メソッド名(引数の型 引数名) {
    //メソッド内での処理内容
}

 

補足:アクセス修飾子について

アクセス修飾子を簡単に説明すると次の表になります。

public すべてのクラスからアクセス可能
protected 同じパッケージに属するか、継承しているサブクラスからのみアクセス可能
なし 同じパッケージからのみアクセス可能
private クラス内からのみアクセス可能

 

サンプルコード:「SAMPLE2.java」

public class SAMPLE2 {

  public static void main(String[] args) {
    String テスト = “テスト”;
    テスト = テスト値(テスト);
    System.out.println(テスト);
  }
  public static String テスト値(String test) {
    if (test.equals(“”)) {
      test = “カラ”;
    } else {
      test = “空でない”;
    }
    return test;
  }
}

実行結果

空でない

staticフィールド・static変数

フィールドの前に「static」がついたものを「staticフィールド(Static変数)」と言います。

staticフィールド(Static変数)はstatic領域に作られる変数のことです。

📝staticフィールド 構文

アクセス修飾子 static 型名 変数

📋メリット
インスタンスを作らなくても使用できる
📒記載例
public class SAMPLE {
 public static String テスト = “test”;
 static public int zyuu = 10;
}
📋補足
※アクセス修飾子の前に記載があってもエラーとならないが、それ以外の箇所にstaticを記入する場合はエラー
static アクセス修飾子 型名 変数
📝staticフィールド へのアクセス方法
・クラス名.フィールド名
・インスタンス名.フィールド名

 

サンプルコード:「SAMPLE3.java」「SAMPLE.java」

public class SAMPLE3 {
  public static void main(String[] args) {
    String テスト = SAMPLE.テスト;
    Integer 十 = new SAMPLE().zyuu;

    System.out.println(テスト);
    System.out.println(十);
  }
}
public class SAMPLE {
  public static String テスト = “test”;
  static public int zyuu = 10;
}

実行結果

test
10

 

どちらも変数でありますが、「フィールド」と「変数」の違いについては次のような違いがあります。

📝「フィールド」と「変数」の違いについて
・フィールド:クラス内に直接書かれる変数のこと(メンバ変数)

・変数(ローカル変数):メソッド内で定義される変数のことです。
   記載例

public class SAMPLE4 {
  static String サンプル = “サンプル”;
 //↑↑はフィールド
  static void プリントアウト() {
    String サンプル2 = “SAMPLE”;
    //↑↑は変数(ローカル変数)
    System.out.println(サンプル);
   System.out.println(サンプル2);
  }
}

※上記プログラムでは、フィールド、変数は次のとおりです。
フィールド:static String サンプル = “サンプル”;
変数(ローカル変数): String サンプル2 = “SAMPLE”;

 

staticイニシャライザ

staticイニシャライザとは「クラスを利用するときに一度だけ呼び出される初期化ブロック

すなわち、static変数の初期化が可能となります。

それでは具体的な記載について見ていきましょう。

📝staticイニシャライザ 構文

static {
  //初期化処理
}

📋メリット
static変数の初期化が可能
📒記載例
static int num = 0:
static {
  num = 10 
}

 

それではサンプルプログラムを使作成します。

サンプルコード:「SAMPLE3.java」「SAMPLE.java」

public class 数値判定 {
  static String 判定 = “”;
  static {
    判定 = “値がセットされました”;
  }
  public static void 数値判定(int 数値) {
    System.out.println(数値);
    System.out.println(判定);
  }
}

public class SAMPLETEST {

  public static void main(String[] args) {
    数値判定.数値判定(11);
  }
}

実行結果

11
値がセットされました

実行結果から、「数値判定メソッド」が呼び出される前に「staticイニシャライザ」で初期化されて変数に値がセットされていることの確認が取れました。

staticフィールドから非staticフィールドへのアクセスは不可能

static領域と非static領域では、場所が違うため以下のような性質を持ちます。

📝staticへのアクセスの可否
・staticメソッドからstaticなフィールドへアクセスできる
・staticでないメソッドからは、staticフィールドにアクセスできる
・staticメソッドは、staticで修飾されたものしかアクセスできない

 

そのため、以下のようなプログラムではコンパイルエラーが起きます。

サンプルコード:「SAMPLE_FINAL.java」

public class SAMPLE_FINAL {
  public  final String FINALTEST = “変更不可”;
  final public static String FINALTEST2 = “変更不可2”;

  public static void main(String[] args) {
    FINALTEST = “変更可”;
  }
}

コンパイルエラー

非 static フィールド FINALTEST を static 参照できません

staticメソッドは、staticで修飾されたものしかアクセスできない」のとおり「static」を付与されていないものにアクセスはできないことを指しています。

 

Java 「static」の動画

なかなか理解できないときはYoutube動画で学習するのも一つの手です。

Youtubeで公開されている動画についてまとめました。

static 動画

 
 
 

 

管理人
以下、関連ページになります

プログラミング 

【Java】変数の宣言及び値のセットについてまとめました(基本のデータ型、配列)

【Java】インスタンスについてまとめました(生成方法や使用方法を紹介)

 

【Java】Listの使い方(put、get、size、isEmpty、removeなど)

【Java】Setの使い方(add、size、isEmpty、clearなど)

【Java】forについてまとめました(for文、break文、continue文など)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

PAGE TOP