🎯

【Java】クラス解説11・publicなフィールドとprivateなフィールド

2024/01/11に公開

publicなフィールドとprivateなフィールド

下記のように、publicなフィールドとprivateなフィールドを比較します。

publicなフィールド

public class Main {
    public static void main(String[] args) {
        // インスタンスを生成
        MyClass obj = new MyClass();
        // インスタンスからfieldAフィールドに文字列"fuji"を代入
        obj.fieldA = "fuzi";
        // インスタンスからfieldAフィールドの値を取得して、標準出力に出力
        System.out.println(obj.fieldA); // 出力結果 -> fuzi
    }
}

class MyClass {
    // publicなフィールド
    public String fieldA;
}

MyClassクラスにあるfieldAフィールドはpublicなので、
他クラスであるMainクラスからインスタンスを使ってfieldAフィールドにアクセスしても、ちゃんと実行(=値を代入、値を取得)されます。


publicでstaticなフィールド

public class Main {
    public static void main(String[] args) {
        // クラス名からfieldBフィールドに文字列"fuji"を代入
        MyClass.fieldB = "fuzi";
        // クラス名からfieldBフィールドの値を取得して、標準出力に出力
        System.out.println(MyClass.fieldB); // 出力結果 -> fuzi
    }
}

class MyClass {
    // publicでstaticなフィールド
    public static String fieldB;
}

MyClassクラスにあるfieldBフィールドはpublicなので、
他クラスであるMainクラスからクラス名を使ってfieldBフィールドにアクセスしても、ちゃんと実行されます。


privateなフィールド

public class Main {
    public static void main(String[] args) {
        // インスタンスを生成
        MyClass obj = new MyClass();
        // インスタンスからfieldCフィールドに文字列"fuji"を代入 -> コンパイルエラー
        obj.fieldC = "fuzi";
        // インスタンスからfieldCフィールドの値を取得して、標準出力に出力 -> コンパイルエラー
        System.out.println(obj.fieldC);
    }
}

class MyClass {
    // privateなフィールド
    private String fieldC;
}

MyClassクラスにあるfieldCフィールドはprivateなので、
他クラスであるMainクラスからインスタンスを使ってfieldCフィールドにアクセスしようとすると、コンパイルエラーとなります。


【参考】privateなフィールドを同じクラスから生成した別インスタンスから利用する場合

public class Main {
    public static void main(String[] args) {
    }
}

class MyClass {
    // privateなフィールド
    private String fieldD;

    // privateなフィールドを同じクラスから生成した別インスタンスから利用する場合 
    // -> コンパイルエラーは起きないが、標準出力には出力されない
    public void methodA(MyClass obj2) {
        obj2.fieldD = "fuzi";
        System.out.println(obj2.fieldD);
    }
}
  • コンパイルエラーが起きない理由
    methodA()が同じクラスのprivateなfieldDにアクセスしているためです。

  • 標準出力にfuziが出力されない理由
    methodA()内のobj2.fieldDは、obj2を通じて他のインスタンスからfieldDにアクセスしようとしますが、fieldDはprivateなので直接アクセスできないため、標準出力に何も出力されないこととなります。

Discussion