外部类可以访问内部类的成员吗?

时间:2011-04-24 12:50:48

标签: java class inner-classes

内部类是在类中定义的类,内部类可以声明为public,private,protected。如果内部类定义为private和protected,外层类可以访问内部类的成员吗?并且内部类可以访问外部类的成员吗?

5 个答案:

答案 0 :(得分:23)

通常,您可以(访问内部类的私有字段,反之亦然)。以下代码在Eclipse下编译:

public class Outer {

  private int x;

  public void f() {
    Inner inner = new Inner();
    inner.g();
    inner.y = 5;
  }

  private class Inner {
    private int y;

    public void g() { x = 5; }
  }    
}

也就是说,您可以配置IDE /编译器来处理对错误等字段的访问(在Eclipse中,此设置称为“访问封闭类型的不可访问成员”,在Preferences - > Java - >下;编译器 - >错误/警告 - >代码样式)

答案 1 :(得分:17)

  

如果内部类定义为私有   和protected,可以外部类访问   内在成员?

是。这些限定符只会影响从外部类派生的类中内部类的可见性。

  

可以内部类访问成员   外类?

是的,包括声明为private的那些,就像任何实例方法一样。

答案 2 :(得分:2)

是的!您可以从外部类访问内部类成员,反之亦然(与访问修饰符无关)。 但是,对于静态嵌套类,您无法仅通过字段名称访问其字段,并且需要像

一样访问它
InnerClass.staticInnerField 

虽然您可以直接通过字段名称从内部类访问外部类的静态字段。

答案 3 :(得分:1)

  

“嵌套类是一个定义的类   在另一个班级内。嵌套类   应该存在只是为了服务它   附上课。如果是嵌套类   在其他一些情况下会有用,   那么它应该是一个顶级的课程。   嵌套有四种   classes:静态成员类,   非静态成员类,匿名   课程和本地课程。除了   第一种被称为内在   类“。

(Joshua Bloch,来自Effective Java。)

至于你的问题:很容易自己测试。但答案是肯定的(即使对于private成员),只要您不是试图从静态上下文访问非静态成员(而不是从引用),或者尝试访问的成员是在一个难以进入的范围内。

就像人们期望的那样=)。

答案 4 :(得分:1)

解释是在常规内部类的上下文中[常规内部类不能在其中声明静态成员]

您可以直接从内部类访问外部类的任何字段

class Outer {
  private static int x = 0;

  class Inner {
    void print() {
      System.out.println(x); // x can be directly accessed
    } 
  }

  public static void main(String[] args) {
    new Outer().new Inner().print();
  }
}

即使是外类也可以通过内部类的对象访问Inner类的任何字段。

class Outer {
  private class Inner {
    private int x = 10;
  }

  void print() {
    Inner inner = new Inner();
    System.out.println(inner.x);
  }

  public static void main(String[] args) {
    Outer outer = new Outer();
    outer.print();
  }
}