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

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

# static修飾子
static修飾子つけたメゾッドは、Processingでいう関数のようなものになる。
つまり、staticなメゾッドは呼びだすために、わざわざインスタンスを生成する必要がない。
## Processingのメゾッド、関数
Processingにおいては、「クラスメゾッド」と「関数」は区別されており、関数はクラスの外に独立して記述できる。以下が実際の例
```java:Exam.pde
class Exam{
  
  public void methodA(){    //これがクラスメゾッド
    println("Example1");
  } 
}
```
```java:methodA.pde
public void methodA(){    //これが関数
  println("Example2");
}
```
以上2つを呼び出すときは以下のようにする。（そもそもProcessingでは、Javaにおけるメインメゾッドが「setup関数」と「draw関数」に分割されており、それらもクラス内に記述する必要がない。）
```java:main.pde
void setup(){
  Exam ex = new Exam();
  ex.methodA();
  methodA();     //関数はインスタンスを生成する必要がない
}
```
以下が実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950626/5940fc53-1c43-84e0-37d3-97b6454e3c5f.png)


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

### クラス内のメゾッドを呼び出す場合
```java: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メゾッドをメインクラスから呼び出す

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

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

```java:Main.java
public class Main {
    
    public static void main(String args[]) {
        new Example().methodC();  //staticメゾッド内で、ほかのクラスの非staticメゾッドの呼び出し
        Example.methodD();  //staticメゾッド内で、ほかのクラスのstaticメゾッドの呼び出し
    }
}
```
:::note warn
staticメゾッド内で、ほかのクラスのstaticメゾッドの呼び出す場合、
[型名].[メゾッド名]
とする
:::

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

### 具体例
例として以下のクラスのメゾッド2つをメインクラスから呼び出す
```java:Example.java
public class Example {
    private int cnt1 = 0;
    private static int cnt2 = 0;
    
    public int getCnt1() {
        return cnt1++;
    }
    public int getCnt2() {
        return cnt2++;
    }
}
```
上記のメゾッドを以下のようにして呼びだすと
```java: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950626/864a3217-45c9-e5c6-773a-ff98b60e0f6e.png)
cnt1は、非staticなのでメゾッドが呼び出される度に、0になる
一方、cnt2は、staticなのでメゾッドが呼び出される度に、インクリメントされている

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

# 参考文献等
https://www.tech-teacher.jp/blog/java-static/


# 更新履歴