メンバの保持形式

メンバへのアクセス可否

public class AccessTest {
    // インスタンス変数
    int instanceVar;

    // クラス変数(static変数)
    static int staticVar;

    // OK: インスタンスメンバ(メソッドと変数)同士は直接アクセス可能
    // 同一のオブジェクト内に格納されているため
    int instanceVarGetter() {
        return instanceVar;
    }

    // OK: インスタンスメンバは、staticメンバに直接アクセス可能
    // インスタンスは、その親であるクラスの持ち物を受け継いでいるため(?)
    int staticVarGetter() {
        return staticVar;
    }

    // ERROR: staticメンバは、インスタンスメンバに直接アクセス不可能
    // インスタンスメンバはインスタンス内に閉じ込められているため
    static int instanceVarGetter_staticVersion() {
        return instanceVar;
    }

    // OK: staticメンバ同士は直接アクセス可能
    // どちらも同一のクラスにあるため
    static int staticVarGetter_staticVersion() {
        return staticVar;
    }

    // OK: インスタンス経由なら、staticメンバもインスタンスメンバにアクセスできる
    static int instanceVarGetter_afterGenerate() {
        AccessTest obj = new AccessTest();
        return obj.instanceVar;
    }
}

nullに対するstaticメンバ呼び出し

class Variables {
    static String staticVar = "static変数";
    String instanceVar = "instance変数";
}

public class Main {
    public static void main(String[] args) {
        Variables obj = null;

        // RESULT: static変数
        // staticメンバはクラスさえ読み込まれれば利用可能
        System.out.println(obj.staticVar);

        // ERROR: java.lang.NullPointerException
        // インスタンスメンバを保持するオブジェクトが空(null)なため
        System.out.println(obj.instanceVar);
    }
}