間違ったコード(staticメソッドからインスタンス変数へアクセス)
public class User {
private String name;
public User(String name) {
this.name = name;
}
// ※ staticをつけてしまうと、nameが使えずコンパイルエラーになる
public static void greet() {
System.out.println("Hello, " + name + "!"); // ← name に赤線(エラー)
}
}
このコードは コンパイルエラー になります。
non-static variable name cannot be referenced from a static context
正しいコード(staticを外す)
public class User {
private String name;
public User(String name) {
this.name = name;
}
// 正しいバージョン:インスタンスメソッド
public void greet() {
System.out.println("Hello, " + name + "!");
}
}
Main.java
public class Main {
public static void main(String[] args) {
User u1 = new User("Alice");
User u2 = new User("Bob");
u1.greet();
u2.greet();
}
}
実行結果
Hello, Alice!
Hello, Bob!
解説
staticメソッドとは?
- staticメソッドは クラスに属しており、インスタンスを持たない
new
しなくても呼び出せる(例:Math.abs()
)
だからこそ──
public static void greet() {
System.out.println("Hello, " + name + "!");
}
このように書いても、name
の「中身」が存在しない。
staticメソッドには「誰の name
か」がわからないからです。
なぜエラーになるのか?
name
は以下のように、インスタンスに属するフィールド(非static)です。
private String name;
これを使うには、「そのインスタンス」が必要です。
でも staticメソッドはインスタンスを前提にしていないため、そもそも name
を持っていないのです。
解決方法は?
static
を外して、インスタンスメソッド(非static)として定義すること。
public void greet() {
System.out.println("Hello, " + name + "!");
}
これで this.name
が使えるようになります。
まとめ
- staticメソッドは インスタンスなしで使う設計
- インスタンス変数(非static)は 各オブジェクトが持つ個別の情報
- staticメソッドからは インスタンス変数にアクセスできない
- もしアクセスしたいなら、インスタンスメソッドとして書く
Just Keep Typing, Baby!では、この「static修羅道」でつまづいた人向けの解説をしています。こちらもぜひ!
// tesh:
// よくわからんまま進めても、どっかでツケが来る。