初学JAVA,没有C币,但是希望大家能够帮忙解决一下问题:
先上代码:
package Test;
public class test9 {
public static void main(String[] args){
Outer outer=new Outer("test");
new Extender(outer,10);
}
}
class Outer{
public Outer(String str){}
class Inner{
public Inner(){}
public Inner(int a){
System.out.println("Inner class has been created");
}
}
}
class Extender extends Outer.Inner{
public Extender(Outer outer,int a){
//outer.super(a); //语句1
outer.new Inner(a); //语句2
}
}
问题出在对Extender类的构造函数的定义上:
之前都一直习惯,直接在构造函数的首行显示引用超构造函数,但是也是一知半解。前几天突然发现这个问题:
我们都知道,super这个关键字其实就是代替了一段字符串“new 父类名”,所以我就想既然用“outer.super(a)”能够编译通过,那“outer.new Inner(a)”应该也能编译通过,于是我做了以下几个实验:
1、执行语句1,不执行语句2:编译通过,打印出“Inner class has been created"
2、执行语句1,也执行语句2:编译通过,打印出两行“Inner class has been created”
3、不执行语句1,执行语句2:编译不通过,报错:“由于某些中间构造函数调用,没有任何类型 Outer 的外层实例可用”
我想不明白的就是,既然实验2中,new outer.Inner(a)能够创建对象成功,为什么在实验3里面,单独运行时就报错呢???