1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

staticについて

JavaSilverSE11の勉強中、staticに関する問題を解いて、インスタンス変数と特徴が異なり、ややこしいと感じる点があったのでstaticについて調べてまとめてみました。



staticメンバとは?

staticメンバは、staticキーワードが付けられたフィールドやメソッドのことです。

クラスに対して静的(static)に存在するメンバであるため、staticメンバは静的メンバとも呼ばれます。



インスタンスメンバとの違い

まずは異なる点をインスタンスメンバとstaticメンバの定義をもとにコードを通して紹介します。

class Sample {
    int instanceNumber;
    static int staticNumber;

        void instanceMethod() {
            System.out.println("instanceMethod()" + instanceNumber);
        }

        static void staticMethod() {
            System.out.println("staticMethod()" + staticNumber);
        }
}

上記のinstanceNumberはインスタンス変数、staticNumberはstatic変数です。

また、instanceMethod()はインスタンスメソッド、staticMethod()はstaticメソッドです。

インスタンスメンバとstaticメンバの違いは一見staticの有無だけのように見えますが、それだけではありません。

インスタンスメンバとstaticメンバの違いはメモリの保存場所もあります。

例えば、インスタンスメンバは1つのクラスから3つのインスタンスを生成すれば「インスタンスメンバの数×3つ分」の領域が確保されるなど、

インスタンスメンバはクラスのインスタンス(オブジェクト)ごとに確保されます。

一方、staticメンバは例え複数インスタンスを生成してもstaticメンバの数1つ分の領域が確保されるだけです。

なぜならstaticメンバはクラス単位で領域が確保されるからです。



staticメンバの呼び出し方

staticフィールドやstaticメソッドの呼び出し方について紹介します。

【staticフィールドの呼び出し方】

クラス名.staticフィールド名

【staticメソッドの呼び出し方】

クラス名.staticメソッド名()

staticメンバはクラス単位で領域が確保されているため、クラス名を記述します。

これは、staticメンバはクラスが読み込まれた時点でメモリ上に展開されるからです。



staticのメリット

staticを使用することで以下のメリットがあります。

newを書くことなく、手軽に呼び出せる。

多くインスタンスを生成することを防ぎ、開発者の負担を減らすことが出来ます。

メモリの消費を抑える。

インスタンスの生成は多くメモリを消費しますが、staticはインスタンスを生成しないため
メモリの消費を抑えることが出来ます。



staticの注意点

staticには様々な制約があり、使用時には注意が必要です。

まず以下のコードを見てください。

public class Sample {
    String instanceTmp;
    static int staticNumber;

        public static void staticMethod() {
            Sample.staticNumber = (int)(Math.random() * 1000);
            System.out.println(this.instanceTmp); //エラー発生
        }
}

上記コードの処理はコメント記載部分でエラーとなります。

staticMethod()はstaticメソッドであるため、Sampleクラスのインスタンスが存在しない状況でも呼び出される場合があります。

Sampleクラスのインスタンスが存在しない状況でstaticMethod()の処理をすると、「this.instanceTmp」をうまく処理出来なくなります。

そのため、staticメソッド内では、staticメンバしか利用できないことに注意してください。



まとめ

staticには以下の特徴があります。特徴をしっかり把握し、インスタンスメンバと使い分けることが大切になってきます。

・フィールドやメソッドにstaticをつけて宣言するとstaticメンバ(静的メンバ)として扱われる。

・staticメンバはクラス内に領域が確保される。

・インスタンスを生成しなくても利用できる。

・staticメソッド内では、staticメンバしか利用できない。



参考文献

  • [https://www.sejuku.net/blog/22426]

  • [https://hrzine.jp/article/detail/48]

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?