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

时间:2014-06-19 16:40:25

标签: java inner-classes

我已经在静态内部类中读到了这个概念: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方法访问内部类的私有属性

我想清楚我的观点。

2 个答案:

答案 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);
}
}

如果你想从主要地方改变​​它..这是做到这一点的方法,但不建议。

希望有所帮助