我正在学习Java中的内部和外部类。我知道内部和外部类是什么以及为什么使用它们。我在这个主题上遇到了以下问题,但找不到答案。
假设给出以下代码:
class outer{
class inner{
}
}
class SubClass extends outer.inner{
}
问题:如何定义最小子类构造函数?为什么?
Option 1-
Subclass () {
//reason: bacause the default constructor must always be provided
}
Option 2-
Subclass (Outer outer) {
//reason : because creating an instance of **Subclass** requires an instance
//of outer, which the **Subclass** instance will be bound to
}
Option 3-
Subclass (Outer outer) {
outer.super();
//reason : because creating an instance of **Subclass** requires an explicit
//call to the **Outer's** constructor, in order to have an enclosing instance
//of **Outer** in scope.
}
Option 4-
Subclass (Outer.inner inner) {
//reason : bacause an instance of **inner** is necessary so that there is a
//source to copy the derived properties from
}
PS。这是一个多项选择题。预计只有1个答案
我是java新手,对这些高级主题不太了解
由于
答案 0 :(得分:2)
以下是JLS中遵循相同逻辑的示例,但未传递封闭实例,而是直接在构造函数中创建它:
例8.8.7.1-1。合格的超类构造函数调用
class Outer {
class Inner {}
}
class ChildOfInner extends Outer.Inner {
ChildOfInner() { (new Outer()).super(); }
}
超类构造函数调用可以细分:
不合格的超类构造函数调用以关键字super开头 (可能以显式类型参数开头)。
合格的超类构造函数调用以Primary开头 表达
它们允许子类构造函数显式指定新的 创建的对象立即封闭了相对于的实例 直接超类(第8.1.3节)。当超类时,这可能是必要的 是一个内在的类。
拟议答案中最接近的案例是
public SubClass(Outer outer) {
outer.super();
}
要扩展Outer.Inner
的内部类Outer
,SubClass
构造函数需要有一个Outer
的实例作为封闭类型。
outer.super();
将调用Outer
构造函数的Inner
父类的构造函数。
outer.super();
语法可能令人不安,因为我们一般不会在构造函数的参数上调用super()
但是在扩展内部类的类的情况下,子类的构造函数允许这样做语法。
答案 1 :(得分:0)
我不认为,“外部”类可以扩展内部类。该结构意味着,一个类可以访问另一个类的私有成员。
但是,你可以有一个内部类来扩展同一个外部类的另一个内部类。
对于构造函数,外部实例在实例化中指定,而不是作为参数:
class Outer {
class Inner {
...
}
class SubInner {
...
}
void method() {
Inner i = this.new SubInner();
}
}