作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我很困惑为什么这是允许的
public class Foo {
class Bar extends Foo {
}
}
这是不允许的
public class Foo {
class Bar extends Foo {
}
class Fooey extends Bar {
}
}
在调用父类(super class)型构造函数之前,编译器通知它不能引用 Fooey.this。
这是允许的
public class Foo {
static class Bar extends Foo {
}
class Fooey extends Bar {
}
}
这是怎么回事?我在哪里可以找到有关内部类继承如何工作的更多信息?
编辑 我想到了两个相当糟糕的想法;内部类扩展外部类,内部类扩展其他静态内部类。我不确定到底发生了什么以及我应该如何重构它。我最终只是抽出内部类并将它们封装在外部类中。
最佳答案
首先:不要做这种事。这是邪恶的。真的,Java 1.1 应该被指定得更加严格,IMO。
在 Foo.Fooey
构造函数中使用哪个 this
存在混淆。外部的 this (Foo.this
) 可以工作。但是实际的 this
是一个 Foo
但它不能传递给超构造函数,因为在超构造函数返回之前使用 this
的规则(和除了有一个外部实例之外,与内部实例相同的实例也被搞砸了)。由于 this
的使用限制,父类(super class)“((Bar)this).this$0
”(IIRC) 上的外部 this 也是不可访问的。
解决方案是明确的。在我的书中,明确通常是一件好事(除非它变成样板)。
public class Foo {
class Bar extends Foo {
}
class Fooey extends Bar {
Fooey() {
Foo.this.super();
}
}
}
更好的是,不要让内部类扩展它自己的外部类,或扩展任何内部类。
关于java - 从外部类继承内部类与其他内部类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1589522/
我是一名优秀的程序员,十分优秀!