Javaのstaticメソッドがインスタンス変数にアクセスできない理由を初心者向けに整理してみた
はじめに
Java Silverの勉強中に、staticメソッドからインスタンス変数にアクセスできない理由が分からず混乱しました。

この記事では、自分の理解を整理するために、初心者向けにまとめます。
結論
staticメソッドは、インスタンスを作らなくても呼び出せるメソッドです。
一方で、インスタンス変数は、インスタンスを作って初めて使える変数です。
そのため、staticメソッドからインスタンス変数を直接使おうとすると、
「どのインスタンスの値を使えばいいの?」
と判断できないため、コンパイルエラーになります。
staticメソッドとは
staticメソッドは、クラスに属するメソッドです。
たとえば、次のようにインスタンスを作らなくても呼び出せます。
class Sample {
static void hello() {
System.out.println("Hello");
}
}
public class Main {
public static void main(String[] args) {
Sample.hello();
}
}
このように、static が付いたメソッドは、Sample.hello() のようにクラス名から呼び出すことができます。
インスタンス変数とは
インスタンス変数は、インスタンスごとに持つ変数です。
class Sample {
int num = 10;
}
この num は、Sample クラスから作られたオブジェクトごとに存在します。
Sample a = new Sample();
Sample b = new Sample();
a.num = 10;
b.num = 20;
この場合、a.num と b.num は別々の値を持ちます。
なぜstaticメソッドから直接アクセスできないのか
次のコードはコンパイルエラーになります。
class Sample {
int num = 10;
static void printNum() {
System.out.println(num);
}
}
理由は、printNum() がstaticメソッドだからです。
staticメソッドは、インスタンスを作らなくても呼び出せます。
Sample.printNum(); // クラス名.staticメソッド名()で呼び出せる
でも、num はインスタンス変数です。
つまり、a.num なのか、b.num なのか、どのインスタンスの num を使えばいいのか分かりません。
そのため、Javaではstaticメソッドからインスタンス変数に直接アクセスできないようになっています。
アクセスしたい場合はどうするか
インスタンスを作って、そのインスタンス経由でアクセスします。
class Sample {
int num = 10;
static void printNum() {
Sample s = new Sample(); // インスタンス生成
System.out.println(s.num);
}
}
または、引数としてインスタンスを受け取る方法もあります。
class Sample {
int num = 10;
static void printNum(Sample s) {
System.out.println(s.num);
}
}
public class Main {
public static void main(String[] args) {
Sample s = new Sample();
Sample.printNum(s);
}
}
このように、インスタンス変数を使いたい場合は、どのインスタンスの値を使うのかを明確にする必要があります。
まとめ
- staticメソッドはクラスに属する
- インスタンス変数はインスタンスに属する
- staticメソッドはインスタンスなしで呼び出せる
- staticメソッドからインスタンス変数を直接使うことはできない
- 使いたい場合は、インスタンスを作ってアクセスする
- または、引数としてインスタンスを受け取る
最後に
この記事は以下を参考に記載しました。
徹底攻略Java SE 17 Silver問題集[1Z0-825]対応