1

次のコードは完全に機能し、実行されます。

public class Complex {

private int real, imag;

Complex(int r, int i) {
    real = r;
    imag = i;
}

public static Complex add(Complex c1, Complex c2) {
    return new Complex(c1.real + c2.real, c1.imag + c2.imag);
}

public String toString() {
    return real + "+i" + imag;
}

public static void main(String[] args) {

    Integer.parseInt("5");
    System.out.println(Complex.add(new Complex(2, 3), new Complex(3, 4)));

}

}

現在、オブジェクト指向の設計モデルによれば、プライベートインスタンスメンバーはオブジェクト参照を介してアクセスされるべきではありません(これはここではc1.realによって行われています)。

したがって、その意味では、コンパイラエラーがあるはずです。しかし、それは反対しません。

今私の理解によれば、それは許可されています

  1. c1.realコードは、プライベートクラスComplexクラス自体の本体に記述されています。

  2. Complexクラスの開発者は、オブジェクト参照を介してアクセスするときに、すべてのインスタンスメンバーにアクセスできる必要があります。これは、開発者がサードパーティとは異なり、自分が何をしているかをよく知っているためです。そのため、ここではオブジェクト指向モデルモデルを採用していません。

c1.realコードがここで許可されている理由について誰かがより良い説明を提案できますか?

4

2 に答える 2

4

privateは、別の外部クラスからアクセスできないことを意味します。これはクラスベースであり、オブジェクトベースのセキュリティではありません。注:同じ外部クラスのクラスは、そのファイル内の他のクラスのプライベートメンバーにアクセスできます。

http://vanillajava.blogspot.co.uk/2012/02/outer-class-local-access.html

于 2012-03-31T10:58:24.383 に答える
0

簡単に言うと、Javaがprivateアクセス修飾子を定義した方法だからです。

より長い答えは、厳密なカプセル化はソースファイルレベルより上でのみ意味があると想定しているため、内部クラスでも外部クラスのプライベートメンバーにアクセスできます(その逆も同様です)。同じソース内のメンバーを非表示にすることは意味がありません。ファイル。クラスのソースファイルにアクセスできる場合は、とにかくアクセス修飾子を簡単に変更できます。

(内外クラスのものは合成アクセサーを介して実現されますが、それらはほぼ完全に透過的です。)

于 2012-03-31T10:58:44.443 に答える