我正在尝试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对象的变量,因为它们是私有的。
答案 0 :(得分:3)
这是一种常见的误解,即私有字段只能由同一个实例访问。
实际上,私有字段在该类中是私有的,而不是实例。因此,该类的任何实例都可以在该类中访问私有字段。
否则,如果成员或构造函数被声明为私有,那么当且仅当它出现在顶级类的主体内时才允许访问(第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)
答案 4 :(得分:0)
这意味着对象的私有成员(方法和变量) 可以从同一类型的另一个对象的内部方法中访问
是的,这是正确的。 “私有”访问修饰符适用于文件级别。
这意味着你不仅可以从不同的对象访问私有成员,甚至可以从不同的类访问,如果一个类是另一个类的嵌套(静态或非静态),本地或匿名类,并且你有一个有效的对象另一类的引用(显式或隐式)。这适用于两个方向(outter< - > inner)。
答案 5 :(得分:0)
请注意,访问限制的目的是明确代码部分之间耦合的范围和范围。
从这个角度来看,类/实例的私有成员应该可以访问该类声明所包含的所有代码 - 实际上它们是。