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

Java:非静态嵌套类和instance.super()

戚森
2023-03-14
问题内容

我很难用Java的非静态嵌套类来解决问题。考虑以下示例,该示例先显示“ Inner”,然后显示“ Child”。

class Outer {
    class Inner {
        Inner() { System.out.println("Inner"); }
    }
}

public class Child extends Outer.Inner {
    Child(Outer o) {
        o.super();
        System.out.println("Child");
    }
    public static void main(String args[]) {
        new Child(new Outer());
    }
}

我知道Inner实例始终必须与Outer实例相关联,这也适用于Child,因为它扩展了Inner。我的问题是o.super()语法的含义-
为什么调用内部构造函数?

我只看到一个super(args)用于调用超类构造函数和super.method()调用重写方法的超类版本的纯文本,但从未使用过这种形式instance.super()


问题答案:

这称为“合格的超类构造函数调用”。

从这里引用:

显式构造函数调用语句可以分为两种:

  • 备用构造函数调用以关键字this(可能以显式类型参数开头)开头。它们用于调用同一类的备用构造函数。

* 超类构造函数的调用以关键字super(可能以显式类型参数开头)或Primary表达式开始。它们用于调用直接超类的构造函数。超类构造函数调用可以进一步细分:

  • 不合格的超类构造函数调用以关键字super(可能以显式类型参数开头)开头。

* 合格的超类构造函数调用以Primary表达式开始。它们允许子类构造函数相对于直接超类(第8.1.3节)显式指定新创建的对象的直接封闭实例。当超类是内部类时,这可能是必需的。



 类似资料:
  • 我正在用Java建模,并使用构建器模式。在许多情况下,一些共同成员是在父级中定义的,而其他成员则是在从父级继承的子级上定义的。一个例子如下: 如果删除,则在上得到相同的错误。看来我对静态嵌套类的继承有一个根本的误解。 为什么当返回时,编译器会抱怨方法不在中?有没有一种方法可以像我所尝试的那样,利用继承和这个构建器模式,允许在父级中定义公共成员,在子级中定义其他成员?

  • 问题内容: 在我看来,创建辅助类时,非公共顶级类和静态嵌套类实际上执行相同的任务。 A.java A.java 除了如何引用它们,在我看来,创建助手类的两种方法之间几乎没有什么区别。它可能主要归结为偏好。有人看到我想念的东西吗?我想有些人会争辩说,每个源文件最好有一个类,但是从我的角度来看,在同一源文件中有一个非公共的顶级类似乎更干净,更有条理。 问题答案: 在这两个示例中,每个源文件都没有一个类

  • 问题内容: 什么是静态嵌套类?静态和非静态嵌套类有什么区别? 问题答案: 静态内部类是嵌套在具有修饰符的另一个类中的类。除了可以访问在其内部定义的类的私有成员之外,它与顶级类几乎相同。 类是静态内部类。类是一个非静态的内部类。两者之间的区别是,非静态内部类的实例被永久连接到的实例-你不能创建一个没有。不过,您可以独立创建对象。 中的代码,并且都可以访问x; 不允许使用其他代码。

  • 问题内容: 我正在查看Java代码,并注意到它使用了静态嵌套类。 使用静态嵌套类而不是普通内部类的原因是什么? 我能想到的唯一原因是Entry不能访问实例变量,因此从OOP的角度来看,它具有更好的封装性。 但是我认为可能还有其他原因,也许是性能。可能是什么? 注意。我希望我的术语正确,可以将其称为静态内部类,但是我认为这是错误的:http : //java.sun.com/docs/books/t

  • 如何验证是否调用了私有嵌套类的非静态方法?这就是我目前的情况: 我明白了: 更新1: @丹尼斯,我试过以下方法,不过我得到了一个。我想根据JVM中已经存在的单例验证方法的运行,而不是创建它的新实例(正如我在下面的代码中所做的那样),以便调用方法。我尝试调用,但没有成功。有没有一种方法可以使用外部类的运行实例上的反射来验证jmockit中对私有嵌套类中非静态方法的调用(通过调用)? 更新2: 尝试获

  • 问题内容: 我想在嵌套的静态接口中使用泛型类。我的目标是做这样的事情: 但是我得到一个错误:无法对非静态类型T进行静态引用。如果进行一些更改(如下所述),我可以在接口内部使用泛型,但是我想避免使用此方法,因为编写同一个类两次:一次用于MyClass,一次用于MyInterface。 谢谢。 编辑 :我想这样做: 要么 问题答案: 静态嵌套类或嵌套接口(顺便说一句,始终是静态的)与其外部类(或接口)