実は一番最初に触ったプログラミング言語はjava。
そのときにこのstatic
くらいから訳がわからなくなって挫折しました。
C/C++を触るようになって今はstatic
と聞くと定数の意味合いと認識してしまうがjavaでは違うらしい。
staticとは
- staticで宣言した変数はクラス内のどこからでも使用できる(クラスに属される)
- staticではない変数は、インスタンスに属される
- 定数として使用する値は
static
ではなくfinal
らしい - mainメソッドは必ず
static
にすること
4/4追記
じゃあいま作ろうとしているメソッドはStaticにするべき?
という疑問。その際は一応下記を検討する。
作っているメソッドにはインスタン固有のインスタンス変数、及びインスタンスメソッドを使用しているか?
答えがyesならnon-static, noならstaticでいいはず。
下記を参考にさせていただきました
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 x
は1
になり、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