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

Java 从内部类对象获取外部类对象

施季
2023-03-14
问题内容

我有以下代码。我想掌握用来创建内部类对象的外部类对象inner。我该怎么做?

public class OuterClass {

    public class InnerClass {
        private String name = "Peakit";
    }

    public static void main(String[] args) {
        OuterClass outer = new OuterClass();
        InnerClass inner = outer.new InnerClass();
       // How to get the same outer object which created the inner object back?
        OuterClass anotherOuter = ?? ;

        if(anotherOuter == outer) {
             System.out.println("Was able to reach out to the outer object via inner !!");
        } else {
             System.out.println("No luck :-( ");
        }
    }
}

编辑:好,你们中的一些人建议通过添加方法来修改内部类:

public OuterClass outer() {
   return OuterClass.this;
}

但是,如果我没有控制权来修改内部类,那(只是确认一下),我们还有其他方法可以从内部类对象中获取相应的外部类对象吗?


问题答案:

在内部类本身中,你可以使用OuterClass.this。该表达式允许引用任何词法包围的实例,在JLS中被描述为Qualifiedthis

我认为没有办法从内部类的代码之外获取实例。当然,你可以随时介绍自己的财产:

public OuterClass getOuter() {
    return OuterClass.this;
}

编辑:通过实验,看起来对外部类进行引用的字段具有包级别访问权限-至少与我正在使用的JDK一样。

编辑:使用(这个名字this$0)是在Java中确实有效,虽然JLS阻碍了它的用法:

该$字符应仅在机械生成的源代码中使用,或者很少用于访问旧系统上的现有名称。



 类似资料:
  • 问题内容: 考虑以下Python(在2.x或3.x中运行): 我想把手放在里面。但: 我不想成为的显式参数。 我想和成为一个类的对象,不是很奇怪像关闭。 您能建议我如何实现这一目标吗? 现在,我最好的主意是使用线程本地存储。在我的用例中,每当我构造一个时,我已经在某个地方的方法中,并且添加没什么大不了的 对我的代码。 这使您对我愿意考虑的堕落程度有所了解。 问题答案: 在Python 2.6中,也

  • 我目前正在进行一个与Firebase集成的Android项目,但是由于Firebase监听器的原因,我正在努力从Firebase实时数据库中检索类对象。 让我详细介绍一下我的项目,以便你能了解它的主要内容。我使用MVVM架构,我有两个活动,其中一个用于身份验证,另一个用于主要用途。 第一个活动包含注册、登录、密码重置片段第二个活动包含4个用于程序主要功能的片段 第一个活动中的片段使用共享的view

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

  • 问题内容: 在下面显示的代码片段中,内部类本身继承了外部类。 方法中的唯一语句(最后一个片段)将值分配给类的私有字段,然后调用该方法。 该方法会导致另一个字符串- 要设置的私人领域中的类调用之前的方法延长。 因此,方法中的以下两个语句: 应该显示 另一个价值 另一个价值 但是他们显示 初始值 初始值 为什么会这样? 问题答案: 方法和领域都是。因此,其他子类(包括子类)均无法访问它们。它们不是继承

  • 这是我正在研究的一个更大问题的一个简短的子问题。 为什么我不能通过第8行outer class中的inner class的实例访问outer类字段? 字段在内部类中可见。 外部类中的非静态方法仍然存在此问题。 字段的可见性并不重要。无论从哪种方式,它都可以从内部类中看到。 可以通过内部类中的(私有)getter访问该字段,但我出现问题的原因之一是,我希望避免这些。 它应该成为不可变的构建器模式的一

  • 问题内容: 如何使用反射创建内部类对象?内部和外部类均具有不带参数的默认构造函数 问题答案: “如果构造函数的声明类是非静态上下文中的内部类,则构造函数的第一个参数必须是封闭的实例;请参见 Java™语言规范的 15.9.3节。” 这意味着您永远不能使用; 构造内部类。相反,您必须使用带有单个实例的构造函数。这是一些示例代码,演示其用法: (请注意,在标准Java术语中, 内部类 始终是非静态的。