2013-05-16 2 views
6

最近、私はJavaでpriavteフィールドにアクセスする予期しない動作を観察しました。行動を示しており、以下の例を考えてみましょう:他のオブジェクトのプライベートフィールドにアクセスできるのはなぜですか?

public class A { 

    private int i; <-- private field! 

    public A(int i) { 
     this.i = i; 
    } 

    public void foo(A a) { 
     System.out.println(this.i); // 1. Accessing the own private field: good 
     System.out.println(a.i);  // 2. Accessing private field of another object! 
    } 

    public static void main(String[] args) { 
     (new A(5)).foo(new A(2)); 
    } 
} 

私はfoo方法(第2ケース)内のクラスAの別のオブジェクトのプライベートフィールドにアクセスさせていただいておりますのはなぜ?

+0

HTML、XMLなどのコード、入出力、構造化文書のコード書式を使用してください。これを行うには、サンプルを選択して、メッセージの投稿/編集フォームの上にある「{}」ボタンをクリックします。 –

答えて

13

プライベートフィールドは、インスタンスではなくクラスを保護します。主な目的は、クラスをAPIとは独立して実装できるようにすることです。インスタンス間でインスタンスを分離するか、インスタンスのコードを同じクラスの静的コードから保護することは何ももたらさないでしょう。

+3

コミュニティwiki?この先制型のダウンボートシールドですか? :) –

+0

@MarkoTopolnikいいえ。実際には、人々がユーザーの写真を見るときにアップヴォートすることを好むということさえ気づきました。 CWの答えはより少ないupvotesとより少ない受諾を集めます(私はdownvotesのために確かに言うことができません)。あなたが悪いと思うなら、あなたはそれを修正することができます。 –

+0

upvoteシールドimho :) –

3

これは同じクラスのためです。これはJavaで許可されています。

多くの目的でこのアクセス権が必要になります。たとえば、equalsの実装では、

+0

必ずしも_need_する必要はありませんが、アクセスするのが少し冗長になります。 – NilsH

+0

はい、あなたは 'obj.getI()'を定義できます。 – NINCOMPOOP

+0

@NoobUnChained:すべてのプライベートフィールドにパブリックアクセサリーがありますか?カプセル化のポイントは何ですか? – Mohayemin

0

fooメソッドは、変数iと同じクラスに属します。このようなアクセスを許可することに害はありません。

関連する問題