![](/img/trans.png)
[英]Accessing public methods of a Private Inner Class, from outside the Enclosing class
[英]How the private properties of inner class are accessed from outside class?
我已经阅读了有关静态内部类的概念:将ViewHolder声明为ListView适配器内部的内部类,以增强getView()的性能。
考虑下面的类
public class OuterClass{
public class InnerClass{
private int privateProperty= -2;
}
public static void main(String[] args) {
OuterClass oc = new OuterClass();
InnerClass ic = oc.new InnerClass();
ic.privateProperty = -98;
}
}
如果内部类包含私有属性,并且内部类的对象在外部类的方法内创建,那么内部类的私有属性可以使用直接访问。 '点'运算符。
我在某处读到了内部类的私有属性是使用外部类的合成setter getter方法访问的
我想澄清一下我的观点。
编译器生成用于访问内部类的私有成员的方法。 如果编译示例代码并检查字节码,您将发现它就像这样编写:
public class OuterClass{
public class InnerClass{
private int privateProperty= -2;
static int access$002(InnerClass obj, int value) {
obj.privateProperty = value;
return value;
}
}
public static void main(String[] args) {
OuterClass oc = new OuterClass();
InnerClass ic = oc.new InnerClass();
InnerClass.access$002(ic, -98);
}
}
线的这种转换
ic.privateProperty = -98;
进入方法调用:
InnerClass.access$002(ic, -98);
静态方法InnerClass.access$002
的创建由编译器完成。 静态方法(我的编译器将其命名为access$002
)是您所了解的“合成设置器方法”的示例。 结果,这两个类的字节码不违反Java的访问规则。
您的概念是错误的。内部类只能在容器类内部使用,这种想法源自您不想向开发人员公开不必要的类的概念,而该类与所有项目都不相关。
在这种情况下InnerClass
将与只OuterClass
。 在主,你应该只为打造新OuterClasS
和将在OuterClass创建的实例InnerClass
所以应该是这样的:
public class OuterClass{
private InnerClass in;
public Class OuterClass() {
in = new InnerClass();
}
//getters & setters
public void setInnerProperty(int x) {
in.setPrivateProperty(x);
}
public class InnerClass{
private int privateProperty= -2;
//getters & setters
}
public static void main(String[] args) {
OuterClass oc = new OuterClass();
oc.setInnerProperty(98);
}
}
万一您要从主要更改它。这是这样做的方法,但不建议这样做。
希望能有所帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.