访问实例对象的私有字段

4

我有一个类,它有一个名为orbits的字段(它与我的类Body具有相同的类型,并且具有private修饰符):

public class Body {

     // I defined it as private field
     private Body orbits = null;

     public Body getOrbits(){
         return orbits;
     }

     public void setOrbits(Body orbits){
    this.orbits = orbits;
     }

     public void capture(Body victim){
        //Why 'victim' can access 'orbits' ?
        victim.orbits = this;
     }
}

在这个类中,我定义了一个名为capture(Body victim)的方法,它有一个类型为Body的参数。我想知道在这个方法中为什么可以直接访问实例victimprivate字段orbits?我的意思是,这个字段是private的,通过实例victim不应该是无法访问的吗?

1
这是因为它在同一个类中被操作。如果是不同的类,它就无法访问。 - skuntsel
5个回答

6

隐私不是按实例计算的 - 而是按类计算的。

该类可以访问所有实例的私有字段。

例如,equals( Object o ) 方法可以将o(如果适当)转换为相同的类型,并将其私有成员与调用equals()方法的对象进行比较。


你的意思是如果我在Body类之外定义了capture(Body victim)方法,那么victim就无法访问orbits,是吗? - Mellon
如果方法capture()被定义在另一个类中(且两个类都不包含对方),那么方法capture()将无法访问Body的私有成员。 - Andy Thomas
如果我不希望同一类的不同实例访问该字段,我该怎么做?更明确地说,我想要的是类似于Scala中的private[this]的东西。 - jack
@jack - 如果你控制类的代码,一种方法是不要从其他实例访问该字段。 - Andy Thomas
@AndyThomas 谢谢。也许我没有表达清楚。我的意思是,在Scala中,如果我定义为private[this] Body orbits,那么这个public void capture(Body victim){victim.orbits = this;}是非法的,因为在private之后有[this](这正是我想要的)。那么在Java中,我们是否有类似的方法来实现呢? - jack
1
@jack - 明白了。Java语言不支持实例访问控制的编译时验证。但是,如果您控制该类,您可以通过在该类中编写的代码来实现该控制。 - Andy Thomas

1
因为victimBody的一个实例,所以它可以访问任何Body实例的字段。

1
根据Java语言规范的第6.6.1节所述:
否则,如果成员或构造函数被声明为私有的,则只有在包含成员或构造函数声明的顶级类(§7.6)的主体内才允许访问。

1
参考JLS是最有说服力的。那也是我的答案。 - skuntsel

0

由于victim也是类型Body,任何Body的实例都可以访问victim实例的私有成员。


0

victim 是 Body 类的一个实例,并具有该类的所有属性。每个实例都将拥有一个私有属性 orbits。

如果您需要一个类属性,请使用 "private static"。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接