私有成员访问Java

Pra*_*u R 6 java accessibility private-members

私有成员是在类级别还是在对象级别进行访问.如果它在对象级别,则不应编译以下代码

    class PrivateMember {
   private int i;
   public PrivateMember() {
      i = 2;
   }
   public void printI() {
      System.out.println("i is: "+i);
   }
   public void messWithI(PrivateMember t) {
      t.i *= 2;
   }
   public static void main (String args[]) {
      PrivateMember sub = new PrivateMember();
      PrivateMember obj = new PrivateMember();
      obj.printI();
      sub.messWithI(obj);
      obj.printI();
   }
}
Run Code Online (Sandbox Code Playgroud)

请说明在sub的messWithI()方法中访问obj的成员i是否有效

Jon*_*eet 7

正如DevSolar所说,它处于(顶级)级别.

Java语言规范的6.6节:

否则,如果成员或构造函数被声明为private,则当且仅当它发生在包含成员或构造函数声明的顶级类(第7.6节)的主体内时才允许访问.

请注意,没有迹象表明它仅限于特定对象的成员.

从Java 7开始,编译器不再允许访问类型变量的私有成员.因此,如果该方法具有类似的签名,public <T extends PrivateMember> void messWithI(T t)则访问将是编译器错误t.i.但是,这不会改变您的特定情况.


Mic*_*rdt 5

请注意,您甚至不需要源级别访问权限来处理私有字段。通过使用java.lang.reflect.AccessibleObject.setAccessibe(),所有代码都可以访问所有其他代码的所有私有成员,除非您指定不允许的安全策略。

private本身并不是一个安全功能!这只是向其他开发人员强烈暗示,某些内容是代码其他部分不应依赖的内部实现细节。