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

标签 java encapsulation inner-classes

直到今天我才意识到这一点,但在 Java 中,私有(private)字段在内部类中并不是真正私有(private)的。您可以实例化一个类并访问这些字段,就好像它们是公共(public)的一样。我的问题是为什么这是用 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;
        }
    }
}

最佳答案

它有助于匿名类。他们可以访问周围的类(就像方法中的最终变量一样)。因此避免了很多 setter/getter,否则您至少必须将它们设为私有(private),从而与私有(private)类之外的更多对象共享。

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

关于Java内部类和私有(private)字段的可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17881464/

相关文章:

java - 在数组中搜索特定字符串

java - 遍历List集合性能问题

java - 如何将URL站点封装成Java对象?

Java:非静态嵌套类和 instance.super()

c++ - 内部类可以访问私有(private)变量吗?

java - 从 String ArrayList 获取输入并输出新字符串

java - 在 Java 中实现组合

c# - C#封装内部类并访问外部

C++:如何使用适当的 OO 有效地将 100 万的私有(private) vector 返回给其他几个类

java - Proguard android找不到引用的类