1
1

More than 1 year has passed since last update.

static修飾子についての覚え書き

Last updated at Posted at 2022-11-03

はじめに

Javaの修飾子に関しての覚え書きです。
この情報は不正確かもしれないのでご了承ください。

static修飾子

static修飾子つけたメゾッドは、Processingでいう関数のようなものになる。
つまり、staticなメゾッドは呼びだすために、わざわざインスタンスを生成する必要がない。

Processingのメゾッド、関数

Processingにおいては、「クラスメゾッド」と「関数」は区別されており、関数はクラスの外に独立して記述できる。以下が実際の例

Exam.pde
class Exam{
  
  public void methodA(){    //これがクラスメゾッド
    println("Example1");
  } 
}
methodA.pde
public void methodA(){    //これが関数
  println("Example2");
}

以上2つを呼び出すときは以下のようにする。(そもそもProcessingでは、Javaにおけるメインメゾッドが「setup関数」と「draw関数」に分割されており、それらもクラス内に記述する必要がない。)

main.pde
void setup(){
  Exam ex = new Exam();
  ex.methodA();
  methodA();     //関数はインスタンスを生成する必要がない
}

以下が実行結果
image.png

Javaにおけるstaticメゾッド

  • staticメゾッド内で、staticメゾッド呼び出すためには、メゾッド名を指定するだけ
  • 非staticメゾッド内で、非staticメゾッド呼び出すためには、メゾッド名を指定するだけ
  • 非staticメゾッド内で、staticメゾッド呼び出すためには、メゾッド名を指定するだけ
    ただし、
  • staticメゾッド内で、非staticメゾッド呼び出すためには、インスタンスの生成が必要

クラス内のメゾッドを呼び出す場合

Main.java
public class Main {
    
    public static void main(String args[]) {
        new Main().methodA();  //staticメゾッド内で、非staticメゾッドの呼び出し
        methodB();  //staticメゾッド内で、staticメゾッドの呼び出し
    }

    public void methodA() {
        System.out.println("これはメインクラスの非staticメゾッド");
        methodB();  //非staticメゾッド内で、staticメゾッドの呼び出し
    }
    public static void methodB() {
        System.out.println("これはメインクラスのstaticメゾッド");
    }
}

ほかのクラスのメゾッドを呼び出す場合

例として以下のクラスの非static、staticメゾッドをメインクラスから呼び出す

Example.java
public class Example {
    
    public void methodC() {
        System.out.println("これはExampleクラスのstaticメゾッド");
    }
    public static void methodD() {
        System.out.println("これはExampleクラスの非staticメゾッド");
    }
}

メインクラスからmethodC、methodDをそれぞれ呼びためには以下のように記述する

Main.java
public class Main {
    
    public static void main(String args[]) {
        new Example().methodC();  //staticメゾッド内で、ほかのクラスの非staticメゾッドの呼び出し
        Example.methodD();  //staticメゾッド内で、ほかのクラスのstaticメゾッドの呼び出し
    }
}

staticメゾッド内で、ほかのクラスのstaticメゾッドの呼び出す場合、
[型名].[メゾッド名]
とする

Javaにおけるstatic変数

static変数はインスタンス化の影響を受けない
⇒インスタンスを生成するごとにフィールド変数が初期値にならず、保持される

具体例

例として以下のクラスのメゾッド2つをメインクラスから呼び出す

Example.java
public class Example {
    private int cnt1 = 0;
    private static int cnt2 = 0;
    
    public int getCnt1() {
        return cnt1++;
    }
    public int getCnt2() {
        return cnt2++;
    }
}

上記のメゾッドを以下のようにして呼びだすと

Main.java
public class Main {
    
    public static void main(String[] args) {
        System.out.println("cnt1 =" + new Example().getCnt1());
        System.out.println("cnt1 =" + new Example().getCnt1());
        System.out.println("cnt1 =" + new Example().getCnt1());
        System.out.println("cnt1 =" + new Example().getCnt1());
        
        System.out.println("cnt2 =" + new Example().getCnt2());
        System.out.println("cnt2 =" + new Example().getCnt2());
        System.out.println("cnt2 =" + new Example().getCnt2());
        System.out.println("cnt2 =" + new Example().getCnt2());
    }
}

以下が実行結果
image.png
cnt1は、非staticなのでメゾッドが呼び出される度に、0になる
一方、cnt2は、staticなのでメゾッドが呼び出される度に、インクリメントされている

※インクリメント:変数の値を1増やす演算のこと

参考文献等

更新履歴

1
1
0

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
1