Contents
【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 戻り値型 メソッド名(引数の型 引数名) {
//メソッド内での処理内容
}
📋メリット
・インスタンスを作らなくても使用できる
📒記載例
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) { |
実行結果
空でない |
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 { System.out.println(テスト); |
実行結果
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 int num = 0:
static {
num = 10
}
それではサンプルプログラムを使作成します。
サンプルコード:「SAMPLE3.java」「SAMPLE.java」
public class 数値判定 { public class SAMPLETEST { public static void main(String[] args) { |
実行結果
11 値がセットされました |
実行結果から、「数値判定メソッド」が呼び出される前に「staticイニシャライザ」で初期化されて変数に値がセットされていることの確認が取れました。
staticフィールドから非staticフィールドへのアクセスは不可能
static領域と非static領域では、場所が違うため以下のような性質を持ちます。
・staticメソッドからstaticなフィールドへアクセスできる
・staticでないメソッドからは、staticフィールドにアクセスできる
・staticメソッドは、staticで修飾されたものしかアクセスできない
そのため、以下のようなプログラムではコンパイルエラーが起きます。
サンプルコード:「SAMPLE_FINAL.java」
public class SAMPLE_FINAL { public static void main(String[] args) { |
コンパイルエラー
非 static フィールド FINALTEST を static 参照できません |
「staticメソッドは、staticで修飾されたものしかアクセスできない」のとおり「static」を付与されていないものにアクセスはできないことを指しています。
Java 「static」の動画
なかなか理解できないときはYoutube動画で学習するのも一つの手です。
Youtubeで公開されている動画についてまとめました。
static 動画
・【Java】変数の宣言及び値のセットについてまとめました(基本のデータ型、配列)
【Java】インスタンスについてまとめました(生成方法や使用方法を紹介)
【Java】Listの使い方(put、get、size、isEmpty、removeなど)