内部静态类字段可见性

时间:2013-06-06 06:30:03

标签: java

我有两个类,如下面

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

5 个答案:

答案 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

  

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

     

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