I never realized this until today, but in Java private fields are not really private on inner classes. You can instantiate a class and access the fields as though they were public. My question is why was this done in Java? What design decisions led to what seems like a break in encapsulation? Are there any advantages to allowing this?
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;
        }
    }
}
