日期:2014-05-20  浏览次数:20862 次

向大家请教"由于某些中间构造函数调用,没有任何类型 Outer1 的外层实例可用"
class Outer1 {
private int a;

public Outer1(int a) {
this.a = a;
}

class Inner {
public Inner() {

}

public void print() {
System.out.println("a=" + a);
}
}
}

public class Simple extends Outer1.Inner{ //这句提示"由于某些中间构造函数调用,没有任何类型 Outer1 的外层实例可用"

public static void main(String[] args) {

}
}

------解决方案--------------------
Java code

public class Simple extends Outer1.Inner{  //这句提示"由于某些中间构造函数调用,没有任何类型 Outer1 的外层实例可用" 

 public Simple (Outer1 outer1){
        outer1.super();
    }

public static void main(String[] args) { 

} 
}

------解决方案--------------------
因为你继承自非静态内部类,
众所周知,在构造类的时候,同样会执行父类的构造方法,去创建属于父类的区域。
而这个你继承的内部类的构造,要依赖于它的外部类存在。

也就是说,如果没有Outer1也就没有你继承的Inner。

按照你的构造方法,是默认的,那么无法创建Outer1,也没法构造Inner。
那么就无法通过编译了。

正确写法见2楼。
------解决方案--------------------
由于class Inner 的定义是非static的,也就是说必须有一个Outer1 的实例以后才能根据这个实例访问Inner.
而public class Simple extends Outer1.Inner中的"Outer1.Inner"是想通过Class Outer1而不是 Outer1 Object来访问Inner,所以是不对的.
把Inner声明成static 就行了.JDK的Tutorial中有详细说明.
static public class Inner {
public Inner() {} 
}