Java内部类和私有字段的可见性

时间:2013-07-26 12:35:39

标签: java encapsulation inner-classes

直到今天我才意识到这一点,但在Java私有字段中,内部类并不是私有的。您可以实例化一个类并访问这些字段,就像它们是公共的一样。我的问题是为什么用Java完成这个?什么样的设计决策导致了封装的突破?允许这样做有什么好处吗?

public class test {
    public static void main(String[] args) {
        Inner inner = new Inner();
        inner.data = "TEST";
        System.out.println(inner.data);

        Inner1 inner1 = new Inner1();
        inner1.data = "TEST";
        System.out.println(inner1.data);

        new test();
    }

    public test() {
        Inner2 inner2 = new Inner2();
        inner2.data = "TEST";
        System.out.println(inner2.data);

        Inner3 inner3 = new Inner3();
        inner3.data = "TEST";
        System.out.println(inner3.data);
    }

    private final class Inner3 {
        private String data;

        public String getData() {
            System.out.println("Inner3.getData()");
            return data;
        }

        public void setData(String data) {
            System.out.println("Inner3.setData(String)");
            this.data = data;
        }
    }

    private class Inner2 {
        private String data;

        public String getData() {
            System.out.println("Inner2.getData()");
            return data;
        }

        public void setData(String data) {
            System.out.println("Inner2.setData(String)");
            this.data = data;
        }
    }

    private static class Inner1 {
        private String data;

        public String getData() {
            System.out.println("Inner1.getData()");
            return data;
        }

        public void setData(String data) {
            System.out.println("Inner1.setData(String)");
            this.data = data;
        }
    }

    private static final class Inner {
        private String data;

        public String getData() {
            System.out.println("Inner.getData()");
            return data;
        }

        public void setData(String data) {
            System.out.println("Inner.setData(String)");
            this.data = data;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

它有助于匿名课程。他们可以访问类(如方法中的最终变量)。因此避免了许多你不得不至少打包私有的setter / getter,从而与私有类共享。

如果您不喜欢这种行为(大多数时候都喜欢我),只需使用静态私有类,这些私有类只能访问私有静态成员,这让我有更好的直觉感受。