澄清私人访问修饰符

时间:2013-08-05 10:48:12

标签: java

我正在尝试Ivor Horton的Java书中的以下代码,其中通过一个简单的类实现了二维点。

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类型的对象作为参数,新创建的Point对象可以直接访问参数Point对象的实例变量x和y。这意味着除了同一个类中的方法之外,还可以从同一类型的另一个对象的内部方法访问对象的私有成员(方法和变量)。任何人都可以澄清这个问题,因为根据我的理解,应该通过getter和setter访问arugment对象的变量,因为它们是私有的。

6 个答案:

答案 0 :(得分:3)

这是一种常见的误解,即私有字段只能由同一个实例访问。

实际上,私有字段在该类中是私有的,而不是实例。因此,该类的任何实例都可以在该类中访问私有字段。

来自JLS - Section 6.6.1

  

否则,如果成员或构造函数被声明为私有,那么当且仅当它出现在顶级类的主体内时才允许访问(第7.6节),其中包含成员的声明或构造函数。

强调我的。

答案 1 :(得分:1)

它是私有的,而不是对象的私有。

这意味着该类的其他实例可以访问同一类对象中的私有变量。

文档并没有立即显而易见 - 但是他们确实谈到了依赖于类而不是对象的访问:

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

答案 2 :(得分: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;
  }
}

注意第二个C'tor aPoint变量。

其次,private表示Class的私有。不是实例。 因此,该类的其他实例可以访问私有成员/方法。

答案 3 :(得分:0)

来自javadocs

  

private修饰符指定只能访问该成员   它自己的班级

你总是在类中的任何地方访问类的私有成员,包括构造函数。

答案 4 :(得分:0)

  

这意味着对象的私有成员(方法和变量)   可以从同一类型的另一个对象的内部方法中访问

是的,这是正确的。 “私有”访问修饰符适用于文件级别。

这意味着你不仅可以从不同的对象访问私有成员,甚至可以从不同的类访问,如果一个类是另一个类的嵌套(静态或非静态),本地或匿名类,并且你有一个有效的对象另一类的引用(显式或隐式)。这适用于两个方向(outter< - > inner)。

答案 5 :(得分:0)

请注意,访问限制的目的是明确代码部分之间耦合的范围和范围。

从这个角度来看,类/实例的私有成员应该可以访问该类声明所包含的所有代码 - 实际上它们是。