【问题标题】:Can an outer class access the members of inner class?外部类可以访问内部类的成员吗?
【发布时间】:2011-08-11 20:25:40
【问题描述】:

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

【问题讨论】:

  • 你试过了吗?自己尝试这些可能会更快。
  • 查找这样的东西比尝试它们要快;现在这篇文章在这里供快速参考! +1 提出一个好问题。

标签: java class inner-classes


【解决方案1】:

如果内部类定义为私有 并且受保护,可以外部类访问 内部类的成员?

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

内部类可以访问 外层?

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

【讨论】:

  • 我们可以直接从外部类调用内部类方法还是通过内部类@Hippo的对象调用内部类方法
  • @MuhammadBabar 通过内部类的对象
【解决方案2】:

通常,您可以(访问内部类的私有字段,反之亦然)。以下代码在 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 -> Compiler - > 错误/警告 -> 代码风格)

【讨论】:

  • 我试过这样做,它在 android Attempt to read from field 'int com.backspace.memebook.MainActivity$MyTask.counter' on a null object reference 中给了我这个错误@
【解决方案3】:

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

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

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

即使是 Outer 类也可以访问 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();
  }
}

【讨论】:

    【解决方案4】:

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

    (Joshua Bloch,来自《Effective Java》一书。)

    至于你的问题:很容易自己测试。但答案是肯定的(即使对于 private 成员),只要您不尝试从静态上下文访问非静态成员(除了来自引用),或者尝试访问位于无法访问的范围。

    也就是说,正如人们所期望的那样 =)。

    【讨论】:

      【解决方案5】:

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

      InnerClass.staticInnerField 
      

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

      【讨论】:

        猜你喜欢
        • 2014-09-09
        • 2018-06-26
        • 2019-08-26
        • 2013-10-21
        • 1970-01-01
        • 2019-09-03
        • 2012-10-29
        • 1970-01-01
        • 2015-01-26
        相关资源
        最近更新 更多