栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

“在调用超类型构造函数之前无法引用此”的奇怪情况

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

“在调用超类型构造函数之前无法引用此”的奇怪情况

应该注意的是,Eclipse

javac
和Intellij IDEA在这些代码片段方面表现出不同的行为。
javac
Java的谜题
行为被用于讨论参考。

我可以将代码段缩减为以下内容:

public class A {    class B extends A {    }    void foo() {        new B() { }; // DOES NOT COMPILE!!    }}

Java Puzzlers
Puzzle 90中 讨论了这种情况 :荒谬,痛苦,超类!

给出的代码段如下:

public class Outer {        // "A"    class Inner1 extends Outer  {}     // "B"    class Inner2 extends Inner1 {}     // "B" anonymous}// DOES NOT COMPILE!!

问题在于,由于如何定义默认构造函数,我们实际上具有以下内容:

// Same as above but with default constructor included explicitlypublic class Outer {    class Inner1 extends Outer  {         Inner1() { super(); }    }    class Inner2 extends Inner1 {        Inner2() { super(); }        }}// STILL DOES NOT COMPILE!!

问题在于,

Inner2
超类本身是一个内部类
Inner1
,因此使
Inner2
的默认构造函数非法,因为它需要将封闭的实例提供给构造函数。

解决问题的“蛮力”方法是为它明确提供一个限定

this
表达式:

// "brute-force" fixpublic class Outer {    class Inner1 extends Outer  {         Inner1() { super(); }    }    class Inner2 extends Inner1 {        Inner2() { Outer.this.super(); }        }}// NOW COMPILES!

然而,难题规定,首先要避免这种复杂的情况。以下是一些引号:

这可以编译,但是令人难以理解。有一个更好的解决方案:每当您编写成员类时,请问自己:此类是否真的需要一个封闭实例?如果答案是否定的,请回答

static
。内部类有时很有用,但是它们很容易引入复杂性,使程序难以理解。它们与泛型(难题89),反射(难题80)和继承(此难题)具有复杂的交互。如果您声明
Inner1
static
,问题就解决了。如果您还声明
Inner2
static
,则实际上可以理解该程序的功能:确实是一个不错的奖励。

总而言之,很少将一个类同时用作另一个的内部类和子类。更普遍地讲,扩展内部类很少是合适的。如果需要,请仔细考虑该封闭实例。此外,

static
与non-
相比,更喜欢嵌套类
static
。可以并且应该声明大多数成员类
static



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/486472.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号