2017-04-22 14 views
0

私はちょうどコードを発見しました。そのインスタンスを使ってクラスのプライベートメンバーにアクセスすることはできませんが(それは問題ありません)別のインスタンス(同じクラスに属します)を持つプライベートメンバーにアクセスします。誰も私に理由を説明してもらえますか?同じクラスの別のインスタンスからプライベートメソッドにアクセスする

class Complex { 
    private double re, im; 
    public String toString() { 
     return "(" + re + " + " + im + "i)"; 
    } 
    Complex(){} 

/*Below c is different instance, still it can access re,im(has a private access) 
    without any error.why? */ 

    Complex(Complex c) { 
     re = c.re; 
     im = c.im; 
    } 
} 

public class Main { 
    public static void main(String[] args) { 
     Complex c1 = new Complex(); 
     Complex c2 = new Complex(c1); 
     System.out.println(c1.re); /* But getting an error here , 
     which is expected as re and im has a private access in Complex class.*/ 
    } 
} 
+2

これはJavaの仕組みだからですか?それ以外の場合、メンバまたはコンストラクタはprivateと宣言され、メンバまたはコンストラクタの宣言を囲むトップレベルクラス(7.6)の本体内で発生する場合にのみアクセスが許可されます。 (JLS 6.6.1)アクセス制御は、Javaではインスタンスではなくクラスによって行われます。 (保護されている点では、この点ではやや厄介です。) –

答えて

0

あなたはから同じクラスで定義されている任意のコードブロックをプライベートメンバーにアクセスすることができます。インスタンスが何であるか、またはインスタンスが存在する場合でも(コードブロックは静的コンテキストにあります)、問題はありません。

異なるクラスで定義されているコードからアクセスすることはできません。

あなたの最初の参照は同じクラスにあります。なぜそれが動作するのですか。Complex。 2番目のクラスは別のクラスのMainにあります。そのため、動作しません。

0

理由はクラスMainは他のクラスのプライベートフィールドにアクセスできません。この場合、Complexクラスのプライベートフィールドに。
Complexクラスのプライベートフィールドには、このクラスのメソッドからのみアクセスできます。つまり、mainメソッドをComplexクラスに移動すると、コードがコンパイルされます。
Complexクラスの値をMain(または他のクラス)から取得/設定する場合は、Complexクラスにセッター/ゲッターを追加する必要があります。あなたが見ることができるように

enter image description here

private行で、すべてが列Classを除くNです:

0

はここでアクセス修飾子を説明する表です。つまり、宣言されているのと同じクラスでプライベートメンバーにアクセスしている限り、プライベートメンバーにアクセスできます。インスタンスを使用して、同じクラスの静的コンテキストからprivate非staticメンバーにアクセスすることもできます。同じインスタンスからのアクセスのみを許可するアクセス修飾子はありません。

なぜですか?

コンパイル時にthisとが同じインスタンスであるかどうかを判断するのは苦痛です。実際にコードを実行して、同じインスタンスを参照しているかどうかを確認する必要があります。

0

概念的には、アクセス指定子は@クラスレベルであり、@インスタンスレベルではありません。

以下は、@ class levelのアクセス指定子を使用する理由です。 JLS Documentationから、アクセスは、契約に基づいて実装している(またはクラス/パッケージを使用している)ユーザーのためのものであることがはっきりとわかります。

簡単な言葉で言えば、私が関心を持つのは、利用可能なメンバ(変数、メソッド)とそれらが何で、どのように使用できるのか(抽象概念の基盤)です。

あなたの場合、それは同じクラスであり、そのメンバにアクセスするためのすべての特権を持ち、したがって観察された動作を持っています。

関連する問題