繁体   English   中英

如何从外部类访问内部类的私有属性?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM