【问题标题】:Is it possible for an inner class to access outer class instance variables? [duplicate]内部类是否可以访问外部类实例变量? [复制]
【发布时间】:2015-08-20 20:23:41
【问题描述】:

假设我有以下代码:

class Outer {
   int n;
   class Inner {
   }
}

Inner 类型的对象是否可以访问其 Outer 对象的实例变量 n? (当我说它时,我指的是与其关联的 Outer 对象。)我知道在内部类的方法中,您可以访问外部类实例变量,也可以在主体内访问(例如,Inner 的实例变量可以初始化为Outer 的实例变量的值),但是否可以更直接地访问 Outer 实例变量?例如,如果 inner 是一个 Inner 类型的对象,那么在上面的代码中是否有类似 inner.n 的东西?

对文本块感到抱歉:基本上,如果inner 是Inner 类型的对象,那么在上面的代码中是否有类似inner.n 的东西?

【问题讨论】:

  • 这不是一个很难为自己尝试的例子xD

标签: java


【解决方案1】:

当然。非静态内部类的生成方式允许它们访问相应外部类中的任何变量(这是一些安全问题的原因)。非静态内部类的实例只能在外部类的给定实例中生成,并持有对外部类的引用,允许它们访问外部类的任何变量。

有关此主题的更多信息,请阅读 java 语言参考。

【讨论】:

    【解决方案2】:

    Inner 类型的对象是否可以访问其 Outer 对象的实例变量 n?

    是的,您也可以访问该类的其他实例的字段,即使它们是私有的。

    我知道在内部类的方法中,您可以访问外部类实例变量,也可以在主体内访问(例如,Inner 的实例变量可以初始化为 Outer 的实例变量的值),但是有可能吗?更直接地访问外部实例变量?例如,如果 inner 是一个 Inner 类型的对象,那么在上面的代码中是否有类似 inner.n 的东西?

    您不能从另一个类访问对 Inner 类可见的字段。只有内部和外部类可以访问它们,除非这些字段是公共的或可以通过普通的访问修饰符访问。

    基本上,如果inner 是Inner 类型的对象,那么在上面的代码中是否有类似inner.n 的东西?

    Inner 没有名为 n 的字段,因此即使通过反射也无法使用该名称访问它。可以在inner类中访问Outer.this.n,可以通过反射获取Outer类的实例,得到n字段。

    【讨论】:

      猜你喜欢
      • 2013-09-20
      • 2020-04-07
      • 1970-01-01
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      • 2012-01-19
      • 1970-01-01
      • 2011-05-11
      相关资源
      最近更新 更多