2011-06-22 14 views
4

は仮定は、私は私が、私は、そのプライベートであることのk.iへのアクセスに関するエラーを取得しないequalsメソッドをなぜだろクラスオーバーライド等号(オブジェクトo)

class Key { 

    public boolean equals(Object o) { 
     Key k = (Key)o; 
     return i == k.i; 
    } 

    private int i; 

} 

がありますか?

+4

あなたは、オブジェクトの平等を変更している場合、 'hashCode'を上書きすることを忘れないでください。 –

答えて

14

同じクラスのメンバーにアクセスしています。メンバの可視性の規則は、クラスに適用され、クラスのオブジェクトには適用されません。

これをさらに拡張するために、Javaコンパイラ(コンパイル時)とJava仮想マシン(実行時)は、オブジェクトに対して可視性ルールを最初に見て適用します。

コンパイラは、フィールドアクセス、メソッド呼び出しおよび同様の式のバイトコードを生成する必要があるときにこのアクティビティを実行します。アクセス規則はオブジェクトの修飾型に基づいて適用され、オブジェクトのみには適用されません。コンパイラの動作は、Java言語仕様で定義されています。

Java仮想マシンは、リンク処理中、言語仕様で定義されているのと同じ規則で、仮想マシン仕様で明示的に定義されたこのアクティビティを実行します。

+0

ありがとう、たくさんの男。 – OneMoreVladimir

+0

ようこそ。 –

+0

@OneMoreVladimirの場合は、この質問の横にあるチェックマークのアウトラインをクリックして回答を受け入れる必要があります。 – wolfcastle

3

あなたはそうではありません。プライベートメンバーの通常の定義は、同じクラスの他のインスタンスからアクセスできることです。

2

"private"メンバーは同じファイル(同じクラス、ネストされた静的クラスと非静的クラス)でアクセスできます。

(もちろん、ネストされた静的クラスはプライベートメンバーにアクセスするには、囲むクラスを明示的に参照する必要があります。)

関連する問題