3

我有两个类如下

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 类是静态的,它的构造函数是私有的。

4

5 回答 5

6

内部类中的字段和方法始终从外部类可见。这是设计使然。如果要隐藏字段和方法,请使用单独的类。

于 2013-06-06T06:36:52.727 回答
2

即使内部类成员被定义为私有和受保护的,外部类也可以访问内部类的成员。这些限定符(私有、受保护等)只会影响从外部类派生的类中内部类的可见性。只需正确引用成员即可:

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;
}
于 2013-06-06T06:38:45.727 回答
2

除了@Uwe Plonus (+1) 给出的答案之外,我可以假设您尝试x通过类访问非静态字段B而不创建实例,即

B.x = 5;

您必须创建 claasB的实例才能访问其实例成员,即

new B().x = 5;

于 2013-06-06T06:39:42.617 回答
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;

    }

}
于 2013-06-06T06:40:09.557 回答
2

医生

非静态嵌套类(内部类)可以访问封闭类的其他成员,即使它们被声明为私有。

与实例方法和变量一样,内部类与其封闭类的实例相关联,并且可以直接访问该对象的方法和字段。

于 2013-06-06T06:44:28.920 回答