🐵

🐵「public static変数とpublic変数の違いってなんや?」【Apex学習】

2024/10/07に公開

最初の疑問

🐵「staticがつくと、同じクラス内で共有されることは理解できたワ!」
🐵「ただ、publicがつけば全体に共有されるから、わざわざ同じクラスで共有するためのstaticなんていらんはずなんや」
🐵「それでも、あえてpublicにstaticを付け加える理由ってなんや??」
🐵「ChatGPT!教えてくれや!」カタカタ…ッツパーーン!

回答

🤖「public static と単なる public には、アクセスレベルだけでなく、アクセスの方法とメンバーの扱い方に違いがあります。どちらも public なので同じクラスや他のクラスからアクセス可能ですが、static 修飾子が付いているかどうかで、そのメンバーが クラスに属するか、インスタンスに属するか が決まります。」

🐵「なるほど、全然わからん!もっとわかりやすく教えてや!」

違いのポイント

1.クラスレベルかインスタンスレベルか

  • public のみ:通常、インスタンスレベルのメンバーを意味します。つまり、クラスのインスタンス(オブジェクト)ごとに独立したコピーが作成されます。メソッドや変数は、インスタンスを生成し、インスタンスを通じてアクセスします。
  • public static:クラスレベルのメンバーを意味します。クラス全体で共有されるため、複数のインスタンス間で同じデータを参照できます。インスタンスを作成せず、クラス名を通じて直接アクセス可能です。

2.アクセス方法

  • public のみ:インスタンスを通してアクセスします。例:exampleInstance.instanceVariable
  • public static:クラスを通じて直接アクセスします。例:ExampleClass.staticVariable

3.ライフサイクル

  • public のみ :インスタンスが生成されるたびに初期化され、インスタンスが破棄されるとメモリから解放されます。
  • public static :最初にクラスがロードされたときに一度だけ初期化され、プログラムが終了するまでメモリに保持されます。

例での比較

public class Example {
    public int instanceCounter = 0;      // インスタンス変数
    public static int classCounter = 0;  // 静的変数

    public void incrementInstanceCounter() {
        instanceCounter++;
    }

    public static void incrementClassCounter() {
        classCounter++;
    }
}

使用方法

public class Main {
    public static void main(String[] args) {
        Example ex1 = new Example();
        Example ex2 = new Example();
        
        ex1.incrementInstanceCounter();  // ex1のinstanceCounterが1になる
        ex2.incrementInstanceCounter();  // ex2のinstanceCounterも1になる(別々のインスタンス)

        Example.incrementClassCounter(); // classCounterは1に
        Example.incrementClassCounter(); // classCounterは2に(全インスタンスで共通)
    }
}

まとめ

🐵「なるほど。つまり、public staticだと、他のインスタンスやクラスからでも変更できてしまうんやな!」

🤖「はい、public static変数はクラス全体で共有され、アクセスするどのクラスやインスタンスからでも値を変更できるため、意図しないデータ変更やバグの原因になりやすいです。」

🐵「・・・」

🐵「めっちゃ危ないやんけ!気をつけよ」

Discussion