有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

我可以在java中的静态嵌套类之间限制对私有字段的访问吗?

如果我有一个包含两个static嵌套类的类,有没有办法限制一个类中的private static字段从另一个类访问?例如:

public class Outer {

  private static class Inner1 {

    private static int privateInner1 = 0;

    private Inner1() {
        System.out.println(privateInner1 + ", " + Inner2.privateInner2); // prints "0, 1"
    }
  }

  private static class Inner2 {
    private static int privateInner2 = 1;
  }

  public static void main(String[] args) {
    new Inner1();
  }
}

并不是说我脑子里真的有这个用例,我只是个古玩

谢谢


共 (3) 个答案

  1. # 1 楼答案

    http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.6.1

    A private class member or constructor is accessible only within the body of the top level class (§7.6) that encloses the declaration of the member or constructor.

    您不能限制从外部类访问内部类,因为外部类可以访问内部类的成员(无论是公共的还是私有的)。在这个场景中,main方法是Outer的一部分,因此它将能够访问Inner1Inner2的成员。最接近目标的方法是在外部类中创建接口实例,并在其中定义成员变量。外部类将无法访问这些成员变量。举个例子

    private interface Example{
        void doSomething();
    }
    private Example Inner3 = new Example(){
        private int privateInner3 = 2;
        public void doSomething(){
            System.out.println(privateInner3);
        }
    }
    

    现在在main方法中,您将无法访问Inner3.privateInner3,但可以调用Inner3.doSomething()

  2. # 2 楼答案

    不可能,您可以提供的最低访问权限是private,您已经提供了),并且由于您试图在同一个类中访问它们,因此您无法阻止它们访问,毕竟它们是属于同一个家族的成员

  3. # 3 楼答案

    不能。当外部类的某些功能在另一个类中提取时更清晰,但它仍然与外部类紧密耦合时,可以使用内部类。因此,基本上,您应该在外部类中使用内部类来实现更好的代码分离