2

次のコードは本番環境ではあまり意味がないため、これまでに記述しようとしたことはありません。しかし、驚くべきことに、このコードは正常にコンパイルされます。同じクラスのインスタンスで静的メソッドからプライベート メソッドを呼び出せるように設計されたのはなぜですか?

public class Beverage {
    private void drink () {
        System.out.println("Beverage");
    }

    public static void main (String[] args) {    
        Beverage b = new Beverage();
        b.drink(); //call to private method!
    }
}
4

5 に答える 5

6

なぜ彼らは彼らを呼ぶことができないのでしょうか? private同じクラスへのアクセスを制限します。静的メソッドは同じクラスにあります。そのため、プライベート メソッドにアクセスできます。

アクセス修飾子は、インスタンス レベルではなく、クラス レベルで機能します。それらがインスタンス レベルで機能した場合、静的ファクトリ メソッド (プライベート コンストラクターと初期化メソッドの呼び出し)、equals()メソッドとcompareToメソッド (2 つのインスタンスのプライベート フィールドの比較) などを記述できませんでした。

于 2013-11-01T06:07:45.063 に答える
0

お気づきの動作は、 の定義と最も一致する動作ですprivate

Java では、private「同じクラス内からのみ呼び出すことができる」という意味です。「所有しているオブジェクトからしか呼び出せない」という意味ではありません。これは、同じ定義を持つ C++ との類似性を理由に多くの決定が下された Java の起源からの持ち越しであると思われますprivate

privateまた、コンストラクターのみを持つクラスやstatic、クラスをインスタンス化するためのメソッドを作成することもできます。

于 2013-11-01T06:09:16.150 に答える