Java内部类和私有字段的可见性
直到今天我才意识到这一点,但在Java中,私有字段在内部类上并不是真正私有的。您可以实例化一个类并像访问公共字段一样访问这些字段。我的问题是,为什么要在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";
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,它们是声明它们的类的一部分,它们与私有方法处于同一级别,因此它们可以访问私有字段。