🎯
【Java】クラス解説10・publicなメソッドとprivateなメソッド
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メソッドから呼び出されるので、問題なく実行されます。
【参考】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