1

Ivor Horton の Java book から次のコードを試しています。このコードでは、単純なクラスを介して 2 次元の点が実装されています。

public class Point
{
  //x and y coordinates
  private xVal,yVal;
  //Constructor
  public Point (double x, double y)
  {
    this.xVal = x;
    this.yVal = y;
  }
  //Constructor
  public Point (final Point aPoint)
  {
    this.xVal = aPoint.xVal;
    this.yVal = aPoint.yVal;

  }

}

さて、私が理解していない点は、タイプ Point のオブジェクトを引数として取る 2 番目のコンストラクターで、新しく作成された Point オブジェクトが、引数 Point オブジェクトのインスタンス変数 x および y に直接アクセスできることです。これは、オブジェクトのプライベート メンバー (メソッドと変数) が、同じクラス内のメソッドに加えて、同じ型の別のオブジェクトのメソッド内からアクセスできることを意味します。私の理解によれば、引数オブジェクトの変数はプライベートであるため、ゲッターとセッターを介してアクセスする必要があるため、誰でも問題を明確にしてください。

4

6 に答える 6

3

これは、private フィールドにアクセスできるのは同じインスタンスだけであるという一般的な誤解です。

実際には、プライベート フィールドはそのクラス内ではプライベートであり、インスタンスに対してではありません。したがって、そのクラスのインスタンスは、そのクラスにいるときにプライベート フィールドにアクセスできます。

JLSから- セクション 6.6.1 :

それ以外の場合、メンバーまたはコンストラクターがプライベートであると宣言されている場合、メンバーまたはコンストラクターの宣言を囲む最上位クラス (§7.6) の本体内で発生した場合にのみ、アクセスが許可されます。

鉱山を強調します。

于 2013-08-05T10:51:01.923 に答える
1

オブジェクトに対してプライベートではなく、クラスに対してプライベートです。

これは、クラスの他のインスタンスが同じクラスのオブジェクト内のプライベート変数にアクセスできることを意味します。

ドキュメントはこれをすぐには明らかにしませんが、オブジェクトではなくクラスに応じたアクセスについて話します:

http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

于 2013-08-05T10:51:29.710 に答える
0

まず、コードにエラーがあります。次のようにする必要があります。

public class Point
{
  //x and y coordinates
  private xVal,yVal;
  //Constructor
  public Point (double x, double y)
  {
    this.xVal = x;
    this.yVal = y;
  }
  //Constructor
  public Point (final Point aPoint)
  {
    this.xVal = aPoint.xVal;
    this.yVal = aPoint.yVal;
  }
}

2 番目の C'tor aPoint 変数に注意してください。

第二にprivate、クラスにプライベートであることを意味します。インスタンスではありません。したがって、クラスの他のインスタンスはプライベート メンバー/メソッドにアクセスできます。

于 2013-08-05T10:53:09.937 に答える
0

javadocsから:

private 修飾子は、メンバーが独自のクラスでのみアクセスできることを指定します

コンストラクターを含むクラス内のクラスのプライベートメンバーに常にアクセスできます。

于 2013-08-05T10:53:19.137 に答える
0

これは、オブジェクトのプライベート メンバー (メソッドと変数) に、同じ型の別のオブジェクトのメソッド内からアクセスできることを意味します。

はい、これは正しいです。「プライベート」アクセス修飾子は、ファイル レベルで機能します。

つまり、一方のクラスが他方のネストされた (静的または非静的)、ローカルまたは匿名クラスであり、そのクラスの有効なオブジェクト参照がある場合、異なるオブジェクトからプライベート メンバーにアクセスできるだけでなく、異なるクラスからアクセスすることもできます。他のクラス (明示的または暗黙的)。これは両方向 (外側 <-> 内側) で機能します。

于 2013-08-05T10:53:35.773 に答える