17

それで、先日クラスを作成していて、Eclipse のメソッドを使用して equals メソッドを作成したときに、次の作業コードが生成されたことに気付きました。

class Test {
  private int privateInt;
  [...]
  public boolean equals(Object obj) {
    [...]
    Test t = (Test) obj;
    if ( t.privateInt == privateInt ) {
    [...]
  }
}

t.privateInt..???? 一応プライベートです!したがって、private、protected、package protected、および public 以外に、もう 1 つのフィールドの可視性があると思います。

では、ここで何が起こっているのでしょうか? これはどのように呼ばれますか?誰かがこれをどこで使用しますか?これはカプセル化を壊しませんか?クラスにミューテーターがなく、これを変更した場合はどうなりますか? これは C++ でも起こりますか? これはOOイディオムですか?そうでない場合、なぜJavaはそれをしたのですか?

一般的に、これに関する情報はどこで入手できますか?

ありがとうございました。

4

6 に答える 6

25

同じクラスの異なるインスタンスからアクセスできます。

このページによると(大胆な鉱山):

メンバー レベルでは、最上位クラスと同じように public 修飾子を使用することも、修飾子を使用しない (package-private) こともでき、同じ意味を持ちます。メンバーには、private と protected の 2 つの追加のアクセス修飾子があります。private 修飾子は、メンバーが独自のクラスでのみアクセスできることを指定します。

わかりやすくするために、次の行を書き直します。

if ( t.privateInt == this.privateInt )

「this.privateInt」を許可する必要があることに同意できます。メッセージ「equals」が送信されたクラス Test のインスタンス内からアクセスしています。

t は Test クラスの別のインスタンスであり、その equals メソッド内で実行していないため、「t.privateInt」を表示する必要があるかどうかはあまり明確ではありません。ただし、両方のオブジェクト (t と this) が同じクラス Test であり、お互いのプライベート メンバーを参照できるため、Java はこれを許可します。

于 2008-11-23T05:52:32.543 に答える
4

マイクはかなり正しいです。オブジェクト (クラスのインスタンス) をクラス自体と混同しています。メンバーは、クラスの特定のインスタンスではなく、クラスに対してプライベートです。

私が Java を初めて使用したとき、これには同じくらい驚いたことを思い出します。

于 2008-11-23T07:00:42.420 に答える
3

他のインスタンスのプライベート メンバーへのアクセスが許可されている大きな理由の 1 つは、「コピー」機能を許可することです。それ以外の場合は、ほとんど不可能です。また、他のインスタンスによるアクセスを許可しない場合、静的メソッドには何を許可しますか?

于 2011-12-09T13:26:26.510 に答える
3

同じクラス内から参照しています。したがって、あなたは自分が何をしているのかを知っており、自分から保護する必要はありません。

于 2008-11-23T05:51:25.930 に答える
1

同じクラスの別のインスタンスのプライベート変数にアクセスできます。これは、クラスの実装を直接扱っているためです。これには、内部の「プライベート」変数について知る必要があります。

于 2008-11-23T07:09:38.173 に答える
0

この混乱に対する簡単な答えは、private フィールドは初期化(および定義) されているクラスでのみ表示されることを覚えておくことです...したがって、クラス内でクラスのオブジェクトを作成すると、常にアクセスできます。オブジェクト参照を介してそのクラスのプライベート フィールド。難しいと感じるかもしれませんが、private フィールドが定義されているクラス内で使用する場合、private フィールドは public フィールドと同じだと考えてください。

于 2009-07-31T05:58:12.880 に答える