我有两个类,如下面
public class A{
private static class B{
private static int s1;
private static int s2;
private int x;
}
}
在B类中,所有字段都是私有的,所有字段都不应该在A类中访问。但是有一个'神秘',静态字段可以在A类中访问,
private int x
无法访问。我的问题是为什么在A类中可以访问私有静态字段?
注意:我的B类是静态的,它的构造函数是私有的。
答案 0 :(得分:4)
内部类中的字段和方法始终可以从外部类中看到。这是设计的。如果要隐藏字段和方法,请使用单独的类。
答案 1 :(得分:2)
即使内部类成员被定义为private和protected,外部类也会访问内部类的成员。这些限定符(private,protected etc)只会影响从外部类派生的类中内部类的可见性。只需正确引用成员:
class A{
private static class B{
private static int s1;
private static int s2;
private int x;
}
int y = new A.B().x;
int z = B.s1;
}
答案 2 :(得分:2)
除了@Uwe Plonus(+1)给出的回答之外,我可以假设你试图通过类x
访问非静态字段B
而不创建实例,即
B.x = 5;
您必须创建claas B
的实例才能访问其实例成员,即
new B().x = 5;
答案 3 :(得分:2)
你将实例与静态混淆,看下面的代码可以访问外部类的所有私有字段,唯一的区别是如果字段不是静态的,你将需要一个对象的实例。
public class Test {
public void dummy() {
new B().x = 5;
new SB().x = 5; //access field by instance
SB.sx = 5; //access static
}
private class B {
private int x;
}
private static class SB {
private SB() {}
private static int sx;
private int x;
}
}
答案 4 :(得分:2)
Doc说
非静态嵌套类(内部类)可以访问封闭类的其他成员,即使它们被声明为私有。
与实例方法和变量一样,内部类与其封闭类的实例相关联,并且可以直接访问该对象的方法和字段。