java implicit super constructor sort() is undefined.

来源:百度知道 编辑:UC知道 时间:2024/05/30 13:26:56
子类继承了父类,怎么写第二个构造器,就会出错?
public class Test {
int i;
public Test(int i){
this.i=i;
}
}

class TestA extends Test{
public TestA(){

}
public TestA(int i,int j){
}
public TestA(int i){
super(i);
}
}

class TestB extends Test{
public TestB(){

}

}

//父类中为什么要保留个默认的构造器,这样子类才能添加新的构造器,不保留,为什么子类要写个跟父类一样的构造器,里面还要调用父类的构造器??

没有父类怎么构造子类啊,构造子类之前是必须要先构造父类的,一般都是隐式调用父类的无参构造器的,所以:

1.如果定义了有参构造器,而又没有无参构造器的话,JVM是不会自己构造无参构造器的,因为虚拟机认为你自己可以定义构造器(java虚拟机说:自己能做为什么还要我帮你定义无参构造器呢)

2.如果没有定义了有参构造器,就可以不用自己定义无参构造器(java虚拟机说:你不会定义构造器啊,那我帮你造个吧)

因为你类中显式的声明了一个构造器,所以默认的构造器就不存在了,但是你在子类的构造器中并没有显式的调用父类的构造器(创建子类对象的时候,一定会去调用父类的构造器,这个不用问为什么),你没有显式调用的话,虚拟机就会默认调用父类的默认构造器,但是此时你的父类的默认构造器已经不存在了,这也就是为什么父类中必须保留默认构造器的原因。
PS.应该养成良好的编程习惯,任何我们自己定义的类,都显式的加上默认的构造器,以后更深入的学习之后,会发现有很多好处。

因为如果不保留默认的构造器,子类中会缺省的调用super(),而有了构造器,java会取消默认的构造器,这样就会出错,当然可以不保留默认的构造器,但这样所有子类都要显式调用super(5)这类的其他构造器,很不方便,所以保留默认的构造器是明智的。