🎯

【Java】クラス解説10・publicなメソッドとprivateなメソッド

2024/01/11に公開

publicなメソッドとprivateなメソッド

下記のように、publicなメソッドとprivateなメソッドを比較します。

publicなメソッド

public class Main {
    public static void main(String[] args) {
        // インスタンスを生成
        MyClass obj = new MyClass();
        // インスタンスからmethodAメソッドを呼び出し
        System.out.println(obj.methodA()); // 出力結果 -> fuzi
    }
}

class MyClass {
    // publicなメソッド
    public String methodA() {
        return "fuzi";
    }
}

MyClassクラスにあるmethodAメソッドはpublicなので、
他クラスであるMainクラスからインスタンスを使ってmethodAメソッドを呼び出しても、ちゃんと実行されます。


publicでstaticなメソッド

public class Main {
    public static void main(String[] args) {
        // クラス名からmethodBメソッドを呼び出し
        System.out.println(MyClass.methodB()); // 出力結果 -> fuzi
    }
}

class MyClass {
    // publicでstaticなメソッド
    public static String methodB() {
        return "fuzi";
    }
}

MyClassクラスにあるmethodBメソッドはpublicなので、
他クラスであるMainクラスからクラス名を使ってmethodBメソッドを呼び出しても、ちゃんと実行されます。


privateなメソッド

public class Main {
    public static void main(String[] args) {
        // インスタンスを生成
        MyClass obj = new MyClass();
        // インスタンスからmethodCメソッドを呼び出し
        System.out.println(obj.methodC()); // -> コンパイルエラー
    }
}

class MyClass {
    // privateなメソッド
    private String methodC() {
        return "fuzi";
    }
}

MyClassクラスにあるmethodCメソッドはprivateなので、
他クラスであるMainクラスからインスタンスを使ってmethodCメソッドを呼び出すと、コンパイルエラーとなります。


privateなメソッドを同じクラスのpublicなメソッドから利用する場合

public class Main {
    public static void main(String[] args) {
        // インスタンスを生成
        MyClass obj = new MyClass();
        // インスタンスからmethodDメソッドを呼び出し
        System.out.println(obj.methodD()); // 出力結果 -> fuzi
    }
}

class MyClass {
    // privateなメソッド
    private String methodC() {
        return "fuzi";
    }
    // privateなmethodCを同じクラスのpublicなmethodDから利用する場合
    public String methodD() {
        return methodC();
    }
}

MyClassクラスにあるmethodDメソッドはpublicなので、
他クラスであるMainクラスからインスタンスを使ってmethodDメソッドを呼び出しても、ちゃんと実行され、戻り値としてmethodCメソッドが実行されます。
methodCメソッドはprivateですが、同じクラスのmethodDメソッドから呼び出されるので、問題なく実行されます。

https://zenn.dev/goriki/articles/010-about-access-modifiers


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

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

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

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

Discussion