私人会员使用Java
-
21-08-2019 - |
题
时在类级别或在对象级别私有成员访问。如果它是在对象级别,然后将下面的代码不应该编译
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();
}
}
请澄清如果访问部件I obj的messWithI内()子的方法是有效的
解决方案
正如DevSolar所说,它是在(顶层)级水平。
从Java语言规范<的 6.6节/一个>:
否则,如果元件或 构造函数被声明为private,然后 访问被允许当且仅当它 顶部的主体内发生 一级类(第7.6节)包围 所述构件的声明或 构造
请注意,有没有迹象表明它仅限于成员,特定对象。
从Java 7,编译器不再允许访问以类型变量的私有成员的。因此,如果该方法有一个像public <T extends PrivateMember> void messWithI(T t)
签名那么这将是一个编译器错误访问t.i
。这不会改变您的特定方案,但是。
其他提示
请注意,你甚至不需要源级别的访问惹私有字段。通过使用java.lang.reflect.AccessibleObject.setAccessibe()
,所有的代码可以访问其他所有代码的所有私有成员,除非您指定不允许它的安全策略。
private
本身不是一项安全功能!这仅仅是一个强有力的暗示,其他开发的东西是一个内部实现细节上的代码其他部分不应该依赖。
都不是。私有访问可以被限制在封闭顶层类,这样就可以访问不同的类的私有成员在同一顶层类:
class PrivateAccess {
static class InnerOne {
private int value;
}
static class InnerTwo {
int getOne ( InnerOne other ) {
return other.value;
}
}
}
的类访问的通常含义意味着你有访问相同类型的其他实例的阴部。在Java中,私人的访问不是由类型词法确定。
类级别。这个想法是,一个类的代码(但没有别的)知道如何处理该类的对象。
如果你有机会到类的源代码反正,有一个从你“隐藏”在事情没有意义。
正如其他人所指出的,私人的,默认访问(“包私人”),受保护的,也许在JDK 7模块是基于类的(有嵌套类很奇怪的规则的继承的,我可以”记得了)。但是,为什么?
主要是向下充当二进制(或更多)运营商的方法。为了有效地执行他们往往需要或更容易编写,而无需使用或修改的公共API。有通过在equals
的实现期待 - 良好的代码,你会发现场的直接访问与几个方法调用this
。 (这样做的性能方面是现在大多与现代JVM内联俗称无关,但代码质量问题仍然存在。)
我想补充到DevSolar的答案,我希望messWithI被声明为static这样:
public static void messWithI(PrivateMember t) {
t.i *= 2;
} 我的日子不好过,甚至读它是什么,你正在尝试没有“静态”的提示做...这也使得它更容易回答你原来的问题 - 这是私有成员的范围不限于只实例中的问题。
在同一页上说,在次节6.6.8,你还可以找到下面的语句:
一个私有类成员或构造仅在该包围的成员或构造的声明顶层类的主体是可访问的。它不是由子类继承。
私有类成员,其访问,我们在这里评价是的 I 的。
公共无效messWithI()的是顶层类其中 I 的主体中存在的已声明的方法,其是,确切的说 PrivateMember
您构建符合上述声明,这就是为什么它运行没有问题。
THAS是另一种方式来表达相同Jon和Devsolar。
有类成员访问改性剂与其中代码被写入,(其中包,并且其中类),不管什么样的部件的接入被准予:一个类的成员或一个实例成员
从逻辑上讲,你不能用一个类的实例成员,如果你没有一个类的实例,但是这是一个不同的问题,涉及到成员的生命周期。