Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java内部类和私有字段的可见性_Java_Encapsulation_Inner Classes - Fatal编程技术网

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

Java内部类和私有字段的可见性,java,encapsulation,inner-classes,Java,Encapsulation,Inner Classes,直到今天我才意识到这一点,但在Java中,私有字段在内部类上并不是真正私有的。您可以实例化一个类并像访问公共字段一样访问这些字段。我的问题是,为什么要在Java中实现这一点?什么样的设计决策导致了封装的突破?允许这样做有什么好处吗 public class test { public static void main(String[] args) { Inner inner = new Inner(); inner.data = "TEST";

直到今天我才意识到这一点,但在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;
        }
    }
}

它有助于匿名类。它们可以访问周围的类(就像方法中的最终变量)。这样就避免了大量的setter/getter,而其他人必须将这些setter/getter至少打包为私有的,从而与私有类以外的其他类共享


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

这是一个语言设计决策。。。也许除了戈斯林先生,没有人能真正回答这个问题。复制的:@kiheru不完全正确。这个问题是问这怎么可能,我是问为什么这样做。它提供了什么(dis)优势,等等@fge我猜从“为什么”部分来看,它只能由该语言的开发人员真正负责,当然,可能有一些我找不到的晦涩难懂的文章澄清了这一决定,也可能是编程语言设计中的一些常见问题。@Glennelson标记为private的成员不能被任何类中的代码访问,除非声明了private成员的类。认为内部类被视为Deisgn choice,它们是声明它们的类的一部分,它们与私有方法处于同一级别,因此它们可以访问私有字段。