1

我正在尝试 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 。这意味着一个对象的私有成员(方法和变量)可以从同类型的另一个对象的内部方法中访问,除了同一个类中的方法。任何人都可以澄清这个问题,因为根据我的理解,arugment 对象的变量应该通过 getter 和 setter 访问,因为它们是私有的。

4

6 回答 6

3

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

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

来自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;
  }
}

注意第二个 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 回答
0

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

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

于 2013-08-05T11:01:36.137 回答