当前位置: 首页 > 面试题库 >

在Java中,当我不在内部类中时,如何访问外部类?

终波涛
2023-03-14
问题内容

如果我有一个内部类的实例,如何 从不在内部类中的代码 访问外部
?我知道在内部类中,我可以Outer.this用来获取外部类,但是我找不到任何外部方式来获取此类。

例如:

public class Outer {
  public static void foo(Inner inner) {
    //Question: How could I write the following line without
    //  having to create the getOuter() method?
    System.out.println("The outer class is: " + inner.getOuter());
  }
  public class Inner {
    public Outer getOuter() { return Outer.this; }
  }
}

问题答案:

Outer$Inner该类的字节码将包含一个名为this$0type
的包作用域Outer。这就是用Java实现非静态内部类的方式,因为在字节码级别上没有内部类的概念。

如果您确实愿意,您应该能够使用反射来读取该字段。我从来不需要这样做,因此最好更改设计以使其不再需要。

这是使用反射时示例代码的外观。天哪,这很丑。;)

public class Outer {
    public static void foo(Inner inner) {
        try {
            Field this$0 = inner.getClass().getDeclaredField("this$0");
            Outer outer = (Outer) this$0.get(inner);
            System.out.println("The outer class is: " + outer);

        } catch (NoSuchFieldException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }

    public class Inner {
    }

    public void callFoo() {
        // The constructor of Inner must be called in 
        // non-static context, inside Outer.
        foo(new Inner()); 
    }

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


 类似资料:
  • 问题内容: 如何从内部类访问外部类? 我正在重写一种使它在不同线程上运行的方法。从内联线程中,我需要调用原始方法,但是当然只要调用就会变成无限递归。 具体来说,我在扩展BufferedReader: 这个地方给了我我找不到的NullPointerException。 谢谢。 问题答案: 像这样: 上面的测试在执行时显示:

  • 问题内容: 我正在尝试创建一个JLabel数组,当单击它们时,所有这些标签都应该变为不可见。当试图通过需要访问用于声明标签的循环的迭代变量的内部类设置鼠标侦听器时,就会出现问题。代码是不言自明的: 我以为我可以通过使用内部方法中的(或代替)内部调用来克服此问题,但我一直无法弄清楚。 编译错误是:从内部类内部访问局部变量i;需要宣布为最终` 我敢肯定,答案一定是我从未想过的愚蠢之举,或者我犯了一些小

  • 问题内容: 在内部类中,可以访问外部类的变量,但不能访问方法的局部变量。我了解了无法访问方法的局部变量的部分,但我想知道为什么外部类变量可以访问? 我的理解是,由于内部类与外部类绑定,因此只要父级可用,子级就可以访问其父级变量。我对么? 问题答案: 假设您的外部类在内部类的范围内(非静态)被称为,以获取该字段。 例如, 其中Outer是类的名称,并标识该字段。 您也可以直接抓取它,但是如果由于阴影

  • 在内部类中,外部类的变量是可访问的,但方法的局部变量不是。我理解了关于方法的局部变量不可访问的部分,但我想知道为什么外部类变量是可访问的? 我的理解是,由于内部类与外部类绑定,因此只要父类可用,子类就可以访问其父变量。我说得对吗?

  • 问题内容: 是否可以从Java内部类中获取对它的引用? 即 问题答案: 您可以像这样访问外部类的实例:

  • 我有一个简单的内部类变量,如何在scala中访问它?