我已经在静态内部类中读到了这个概念: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方法访问内部类的私有属性
我想清楚我的观点。
答案 0 :(得分:4)
编译器生成访问内部类的私有成员的方法。如果您编译示例代码并检查字节码,您会发现它就像是这样写的:
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
)是您已阅读的“合成setter方法”的示例。因此,这两个类的字节码不违反Java的访问规则。
答案 1 :(得分:0)
你的概念是错误的。内部类只是在容器类中使用,这个想法来自你不想将不需要的类暴露给开发人员的概念,这与所有项目无关
在这种情况下,InnerClass
仅与OuterClass
相关。在main中,你应该只为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);
}
}
如果你想从主要地方改变它..这是做到这一点的方法,但不建议。
希望有所帮助