はじめに
Javaの修飾子に関しての覚え書きです。
この情報は不正確かもしれないのでご了承ください。
static修飾子
static修飾子つけたメゾッドは、Processingでいう関数のようなものになる。
つまり、staticなメゾッドは呼びだすために、わざわざインスタンスを生成する必要がない。
Processingのメゾッド、関数
Processingにおいては、「クラスメゾッド」と「関数」は区別されており、関数はクラスの外に独立して記述できる。以下が実際の例
class Exam{
public void methodA(){ //これがクラスメゾッド
println("Example1");
}
}
public void methodA(){ //これが関数
println("Example2");
}
以上2つを呼び出すときは以下のようにする。(そもそもProcessingでは、Javaにおけるメインメゾッドが「setup関数」と「draw関数」に分割されており、それらもクラス内に記述する必要がない。)
void setup(){
Exam ex = new Exam();
ex.methodA();
methodA(); //関数はインスタンスを生成する必要がない
}
Javaにおけるstaticメゾッド
- staticメゾッド内で、staticメゾッド呼び出すためには、メゾッド名を指定するだけ
- 非staticメゾッド内で、非staticメゾッド呼び出すためには、メゾッド名を指定するだけ
- 非staticメゾッド内で、staticメゾッド呼び出すためには、メゾッド名を指定するだけ
ただし、 - staticメゾッド内で、非staticメゾッド呼び出すためには、インスタンスの生成が必要
クラス内のメゾッドを呼び出す場合
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メゾッドをメインクラスから呼び出す
public class Example {
public void methodC() {
System.out.println("これはExampleクラスのstaticメゾッド");
}
public static void methodD() {
System.out.println("これはExampleクラスの非staticメゾッド");
}
}
メインクラスからmethodC、methodDをそれぞれ呼びためには以下のように記述する
public class Main {
public static void main(String args[]) {
new Example().methodC(); //staticメゾッド内で、ほかのクラスの非staticメゾッドの呼び出し
Example.methodD(); //staticメゾッド内で、ほかのクラスのstaticメゾッドの呼び出し
}
}
staticメゾッド内で、ほかのクラスのstaticメゾッドの呼び出す場合、
[型名].[メゾッド名]
とする
Javaにおけるstatic変数
static変数はインスタンス化の影響を受けない
⇒インスタンスを生成するごとにフィールド変数が初期値にならず、保持される
具体例
例として以下のクラスのメゾッド2つをメインクラスから呼び出す
public class Example {
private int cnt1 = 0;
private static int cnt2 = 0;
public int getCnt1() {
return cnt1++;
}
public int getCnt2() {
return cnt2++;
}
}
上記のメゾッドを以下のようにして呼びだすと
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());
}
}
以下が実行結果
cnt1は、非staticなのでメゾッドが呼び出される度に、0になる
一方、cnt2は、staticなのでメゾッドが呼び出される度に、インクリメントされている
※インクリメント:変数の値を1増やす演算のこと
参考文献等