外部类能够访问内部类的成员吗?

24

内部类是定义在类内部的类,可以声明为public、private、protected。如果内部类被定义为私有和受保护的,外部类能否访问内部类的成员?内部类能否访问外部类的成员?


11
你试过了吗?自己尝试这样的事情可能会更快。 - whirlwin
3
查找相关信息比尝试实验更快,现在这篇文章可以快速查阅!对于这个好问题要点赞。 - Murey Tasroc
5个回答

31

通常情况下,您可以(访问内部类的私有字段,反之亦然)。以下代码可在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中,此设置称为“访问封闭类型的非可访问成员”,位于首选项-> Java->编译器->错误/警告->代码样式下)。


我尝试在Android上做这个,但是它给了我这个错误:Attempt to read from field 'int com.backspace.memebook.MainActivity$MyTask.counter' on a null object reference - Sagar Balyan

31

如果内部类被定义为private或protected,外部类能访问内部类的成员吗?

可以。这些修饰符只会影响从外部类派生的类中内部类的可见性。

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

可以,包括声明为private的成员,就像任何实例方法一样。


我们可以直接从外部类调用内部类的方法,或通过内部类对象调用该方法吗?@Hippo - Muhammad Babar
通过内部类的对象@MuhammadBabar - Varun

4

以下内容是针对常规内部类的解释[常规内部类不能在其内部声明静态成员]

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

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();
  }
}

即使外部类可以访问内部类的任何字段,但必须通过内部类的对象来访问。

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();
  }
}

3

是的!你可以从外部类访问内部类成员,反之亦然(无论访问修饰符如何)。但是,对于静态嵌套类,你不能仅通过字段名称访问其字段,需要像这样访问:

InnerClass.staticInnerField 

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

3
“嵌套类是在另一个类中定义的类。嵌套类应该只为其封闭类服务。如果在其他上下文中嵌套类有用,则应将其作为顶级类。有四种类型的嵌套类:静态成员类,非静态成员类,匿名类和局部类。除第一种类型外,所有嵌套类都称为内部类。”(来自Effective Java一书中的Joshua Bloch)。
至于您的问题:这很容易自己测试。但是答案是肯定的(即使对于私有成员),只要您不试图从静态上下文中访问非静态成员(除了来自引用之外的成员),或者尝试访问不可访问范围中的成员。
也就是说,很符合我们的预期 =)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接