2

以下のコードがプライベートメンバー変数で機能している理由を誰かに説明してもらえますか?

    public class Person implements Comparable<Person> {
    private String firstName;
    public Person(String firstName) {
        this.firstName = firstName;
        }

    @Override
    public int compareTo(Person o) {
        return firstName.compareToIgnoreCase(o.firstName);  // why does it work?    }    }
    }
}

EDITなぜo.firstNameコンパイルを取得していますか? ここで、firstName はprivate変数です。

4

5 に答える 5

12

アクセス修飾子は、インスタンスごとではなく、クラスごとにアクセスを制御します。したがって、クラスのメソッドは、他のクラスのインスタンスのTすべてのメンバー (プライベートも含む) にアクセスできます。T

好奇心旺盛な人のためのJLS 7リンクからのアクセス制御。「アクセシビリティは、コンパイル時に決定できる静的プロパティであることに注意してください。型と宣言修飾子のみに依存します。」

于 2012-06-20T12:43:14.730 に答える
3

プライベート変数は、それらを宣言するクラス内で表示されoPerson.

于 2012-06-20T12:42:27.570 に答える
1

メソッド「compareTo」は、プライベート メンバーに自然にアクセスできる「Person」クラスに実装されています。インターフェイス Comparable からメソッドをオーバーライドします。したがって、どちらの場合も同じクラスで作業しています。

于 2012-06-20T12:42:58.787 に答える
1

同じクラスのオブジェクトは、お互いのプライベート プロパティにアクセスできるためです。このようなアクセスのコードは同じクラス内にある必要があるため、クラスは引き続きプロパティを担当するため、これは懸念の分離を完全に壊すわけではありません。

于 2012-06-20T12:44:20.533 に答える
0

それらを宣言するクラス内でプライベートメンバーを使用していますが、これはまったく問題ありません。

宣言するクラスは、メンバーが属しているクラスのインスタンスに関係なく、常にすべてのメンバーにアクセスできます。

したがって、次のコードはコンパイルされて機能します。

public class AClass {
    private String name;
    public AClass(String n) {name = n;}

    public void mock(AClass other) {
        System.out.pritln(this.name + ": \"" + other.name + " smells.\"");
    }

    public static void main(String[] args) {
        AClass a = new AClass("Bully");
        AClass b = new AClass("Nemesis");
        a.mock(b);
    }
}
于 2012-06-20T12:43:11.457 に答える