105
class Person 
{
   private BankAccount account;

   Person(BankAccount account)
   {
      this.account = account;
   }

   public Person someMethod(Person person)
   {
     //Why accessing private field is possible?

     BankAccount a = person.account;
   }
}

デザインは忘れてください。私は、OOP がプライベート オブジェクトがクラスに対してプライベートであることを指定していることを知っています。私の質問は、プライベート フィールドがオブジェクト レベルのアクセスではなくクラス レベルのアクセスを持つように OOP が設計されたのはなぜですか?

4

9 に答える 9

25

良い質問。オブジェクト レベルのアクセス修飾子により、カプセル化の原則がさらに強化されるようです。

しかし、実際は逆です。例を見てみましょう。オブジェクトのプライベート メンバーにアクセスできない場合に、コンストラクターでオブジェクトをディープ コピーするとします。その場合、すべてのプライベート メンバーにいくつかのパブリック アクセサーを追加することが唯一の方法です。これにより、オブジェクトはシステムの他のすべての部分に対して裸になります。

したがって、カプセル化は、他のすべての世界に対して閉じていることを意味するものではありません。それは、誰に対してオープンになりたいかを選択することを意味します。

于 2014-03-07T14:25:13.657 に答える
17

Java 言語仕様のセクション 6.6.1を参照してください。アクセシビリティの決定

それは述べています

それ以外の場合、メンバーまたはコンストラクターが宣言されている場合、privateメンバーまたはコンストラクターの宣言を囲む最上位クラス (§7.6) の本体内で発生した場合にのみ、アクセスが許可されます。

詳細については、上のリンクをクリックしてください。答えは、James Gosling と他の Java の作成者がそうすることに決めたからです。

于 2013-06-10T15:21:19.407 に答える
0

private アクセス修飾子により、クラス内でのみ可視になるためです。このメソッドはまだクラス内にあります。

于 2013-06-10T15:14:43.110 に答える
-1

ここで最初に理解しなければならないことは、おっとの原則に従う必要があるということです。したがって、カプセル化とは、データをパッケージ (つまりクラス) 内にラップし、すべてのデータをオブジェクトとして表し、アクセスしやすくすることです。そのため、フィールドを個別にアクセスするよりも非プライベートにする場合。そしてそれは悪いパラティスにつながります。

于 2016-02-03T11:37:37.120 に答える