当 class 实现该接口时,class 是否继承在该接口内声明的抽象内部 class?
Does a class inherit an abstract inner class declared within an interface when the class implements that interface?
我是运行以下java版本
openjdk 版本“10.0.1”2018-04-17
OpenJDK 运行时环境 (build 10.0.1+10-Ubuntu-3ubuntu1)
OpenJDK 64 位服务器 VM(构建 10.0.1+10-Ubuntu-3ubuntu1,混合模式)
节目 1
class Outer{
abstract class Inner{
void m1(){
System.out.println("Inner class m1 method");
}
}
}
class Outer2 extends Outer.Inner{
Outer2(){
new Outer().super();
}
}
class Test{
public static void main(String[] args) {
new Outer2().m1();
}
}
输入:深(大师*)JavaStuffs $javacsample.java
深 (master *) JavaStuffs $ java 测试
输出:内部classm1方法
节目 2
interface Outer{
abstract class Inner{
void m1(){
System.out.println("Inner class m1 method");
}
}
}
class J implements Outer{
}
class Outer2 extends J.Inner{
Outer2(){
new J().super();
}
}
class Test{
public static void main(String[] args) {
new Outer2().m1();
}
}
输入:深(大师*)JavaStuffs $javacsample.java
输出: sample.java:1309:错误:非法限定符;内在不是内在class
新 J().super();
^
1 个错误
节目 3
interface Outer{
abstract class Inner{
void m1(){
System.out.println("Inner class m1 method");
}
}
}
class J implements Outer{
class InnerJ extends Inner{
}
}
class Outer2 extends J.Inner{
Outer2(){
new J().super();
}
}
class Test{
public static void main(String[] args) {
new J().new InnerJ().m1();
new Outer2().m1();
}
}
输入:深(大师*)JavaStuffs $javacsample.java
输出: sample.java:1372:错误:非法限定符;内在不是内在class
新 J().super();
^
1 个错误
在程序2和程序3中,我预计class将继承内部抽象class 当它实现接口时。但事实并非如此!谁能解释一下?一个确切的原因将不胜感激!
没有。 类继承父类的实例变量和实例方法,实现相同的接口。他们可以访问其父 classes 的静态成员以及直接或间接实现的接口 ,就好像 它们是继承的一样,但这在技术上是另一回事。
嵌套的 classes 和接口不是继承的,既不是从父 classes 也不是从实现的接口,但是子 class 的实例可以作为包含实例它的父 class 的内部 class.
将一个 class 或接口嵌套在另一个内部首先提供了一个额外的命名空间级别。 Parent.Inner
与 Child.Inner
不同 class -- 不考虑任何其他因素,您知道因为它们的名称不同。因此,子 classes 不会继承嵌套的 classes。没有什么好办法,也没有什么特别的优势。
在接口内定义的成员 class 总是隐式地 static
。它不是内部 class,而是静态成员 class,并且没有与之关联的外部 class 实例。
Java Language Specification states this in section 9.5:
A member type declaration in an interface is implicitly public and
static. It is permitted to redundantly specify either or both of these
modifiers.
因此,在您的程序 2 中,在 class Outer2
的构造函数内部,您不能说 new J().super();
,因为 Outer2
没有外部实例 -它不是内部 class。来自 javac 的错误说明了很多:"illegal qualifier; Inner is not an inner class"
我是运行以下java版本
openjdk 版本“10.0.1”2018-04-17
OpenJDK 运行时环境 (build 10.0.1+10-Ubuntu-3ubuntu1)
OpenJDK 64 位服务器 VM(构建 10.0.1+10-Ubuntu-3ubuntu1,混合模式)
节目 1
class Outer{
abstract class Inner{
void m1(){
System.out.println("Inner class m1 method");
}
}
}
class Outer2 extends Outer.Inner{
Outer2(){
new Outer().super();
}
}
class Test{
public static void main(String[] args) {
new Outer2().m1();
}
}
输入:深(大师*)JavaStuffs $javacsample.java
深 (master *) JavaStuffs $ java 测试
输出:内部classm1方法
节目 2
interface Outer{
abstract class Inner{
void m1(){
System.out.println("Inner class m1 method");
}
}
}
class J implements Outer{
}
class Outer2 extends J.Inner{
Outer2(){
new J().super();
}
}
class Test{
public static void main(String[] args) {
new Outer2().m1();
}
}
输入:深(大师*)JavaStuffs $javacsample.java
输出: sample.java:1309:错误:非法限定符;内在不是内在class
新 J().super();
^
1 个错误
节目 3
interface Outer{
abstract class Inner{
void m1(){
System.out.println("Inner class m1 method");
}
}
}
class J implements Outer{
class InnerJ extends Inner{
}
}
class Outer2 extends J.Inner{
Outer2(){
new J().super();
}
}
class Test{
public static void main(String[] args) {
new J().new InnerJ().m1();
new Outer2().m1();
}
}
输入:深(大师*)JavaStuffs $javacsample.java
输出: sample.java:1372:错误:非法限定符;内在不是内在class
新 J().super();
^
1 个错误
在程序2和程序3中,我预计class将继承内部抽象class 当它实现接口时。但事实并非如此!谁能解释一下?一个确切的原因将不胜感激!
没有。 类继承父类的实例变量和实例方法,实现相同的接口。他们可以访问其父 classes 的静态成员以及直接或间接实现的接口 ,就好像 它们是继承的一样,但这在技术上是另一回事。
嵌套的 classes 和接口不是继承的,既不是从父 classes 也不是从实现的接口,但是子 class 的实例可以作为包含实例它的父 class 的内部 class.
将一个 class 或接口嵌套在另一个内部首先提供了一个额外的命名空间级别。 Parent.Inner
与 Child.Inner
不同 class -- 不考虑任何其他因素,您知道因为它们的名称不同。因此,子 classes 不会继承嵌套的 classes。没有什么好办法,也没有什么特别的优势。
在接口内定义的成员 class 总是隐式地 static
。它不是内部 class,而是静态成员 class,并且没有与之关联的外部 class 实例。
Java Language Specification states this in section 9.5:
A member type declaration in an interface is implicitly public and static. It is permitted to redundantly specify either or both of these modifiers.
因此,在您的程序 2 中,在 class Outer2
的构造函数内部,您不能说 new J().super();
,因为 Outer2
没有外部实例 -它不是内部 class。来自 javac 的错误说明了很多:"illegal qualifier; Inner is not an inner class"