' P '

whatever I will forget

Java Static とは?メモ

実は一番最初に触ったプログラミング言語java
そのときにこのstaticくらいから訳がわからなくなって挫折しました。

C/C++を触るようになって今はstaticと聞くと定数の意味合いと認識してしまうがjavaでは違うらしい。

staticとは

  1. staticで宣言した変数はクラス内のどこからでも使用できる(クラスに属される)
  2. staticではない変数は、インスタンスに属される
  3. 定数として使用する値はstaticではなくfinalらしい
  4. mainメソッドは必ずstaticにすること

4/4追記

じゃあいま作ろうとしているメソッドはStaticにするべき?
という疑問。その際は一応下記を検討する。
作っているメソッドにはインスタン固有のインスタンス変数、及びインスタンスメソッドを使用しているか?
答えがyesならnon-static, noならstaticでいいはず。

下記を参考にさせていただきました

nobuo-create.net

6/10追記

やはり、staticあんまりに理解していなかった。。。
下記コードはstaticの動きがよくわかる。
出力結果はどうなるでしょうか?
答えは4です。

class A {
    static int x;
    void increment() {++x;}
}

public class Main {
    public static void main(String[] args) {
        A obj1 = new A();
        A obj2 = new A();
        obj1.x = 0;
        obj1.increment();
        obj2.increment();
        System.out.println(obj1.x+obj2.x);
    }
}

なぜか

最初、意味不明でした。(だからstaticを理解していないと気づけてよかったけど)
staticはクラス固有の変数、言ってしまえばobjを跨いだ共通変数のような位置づけになるため、
obj1から、obj2からどちらのincrement()にアクセスしようが、+1されるわけです。
なので、1回目のincrement()にて、Class Aのint x1になり、2回目のincrement()にて2になるわけ。
なので2+2=4となります。

サンプルコード

まあ動きを確認するのが一番理解に近づく。 前述したHuman.java(クラス)とget_set.javaがあるとする

public class Human {
    private String name;
    Human() {
        name = "unko";
    }
    Human(String s) {
        name = s;
    }
    // Getter
    public String getName() {
        return name;
    }
    // Setter
    public void setName(String s) {
        this.name = s;
    }
}
public class get_set2 {
    public static void main(String[] args) {
        //Human a1 = new Human();
        System.out.println(Human.getName());
    }
}

もちろん、Humanオブジェクトを生成していないので、getNameメソッドは呼び出せない。(コンパイルエラー)
非staticな関数を呼び出そうとしているためだ。(インスタンス固有のメソッドをcallしようとしている)

下記のようにclass内の変数、関数定義をstaticに変えてみる。

public class Human {
    static String name; //private から staticに変更
    Human() {
        name = "unko";
    }
    Human(String s) {
        name = s;
    }
    // Getter
    public static String getName() { //staticを追加
        return name;
    }
    // Setter
    public static void setName(String s) { //staticを追加
        name = s;                                            //thisを削除
    }
public class get_set2 {
    public static void main(String[] args) {
        Human.setName("manko");                          //呼び出せる!
        System.out.println(Human.getName());      //呼び出せる!
    }
}
manko