内部静态类字段可见性

dpiehjr4  于 2021-06-30  发布在  Java
关注(0)|答案(5)|浏览(294)

我有两个班级,如下所示

public class A{

  private static class B{
   private static int s1;
   private static int s2;
   private int x;

  }
}

在类b中,所有字段都是私有的,这些字段在类a中不应被访问。但有一个“谜”是,静态字段在类和类中是可以访问的

private int x

无法访问。我的问题是为什么私有静态字段在类a中是可访问的?
注意:我的b类是静态的,它的构造函数是私有的。

eoxn13cs

eoxn13cs1#

你把示例和静态混淆了,看看下面的代码,外部类可以访问所有私有字段,唯一的区别是如果字段不是静态的,你就需要一个对象的示例。

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;

    }

}
i7uq4tfw

i7uq4tfw2#

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

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;
}
deyfvvtc

deyfvvtc3#

医生说
非静态嵌套类(内部类)可以访问封闭类的其他成员,即使它们被声明为私有。
与示例方法和变量一样,内部类与其封闭类的示例相关联,并且可以直接访问该对象的方法和字段。

jc3wubiy

jc3wubiy4#

内部类中的字段和方法总是从外部类可见。这是故意的。如果要隐藏字段和方法,请使用单独的类。

envsm3lx

envsm3lx5#

除了@uwe plonus(+1)给出的答案之外,我可以假设您试图访问非静态字段 x via类 B 不创建示例,即。 B.x = 5; 你必须创建claas的示例 B 访问其示例成员,即。 new B().x = 5;

相关问题