初学Java的时候,在继承这边遇上一个错误:Implicit super constructor Father() is undefined for default constructor. Must define an explicit constructor。查阅资料找到一点思路,源代码如下:
package hank;
public class ExtendsDemo1 extends Father {
public String spectacle_frame;
//相同名称的变量子类会自动覆盖主类的变量
static String name = "小王";
//子类的无参构造器
//子类有没有无参构造器并不重要,可以不写
/*public ExtendsDemo1() {
}*/
//子类具有一个参数的构造器
public ExtendsDemo1(String spectacle_frame) {
this.spectacle_frame = spectacle_frame;
}
public static void main(String[] args) {
ExtendsDemo1 t1 = new ExtendsDemo1("Blue");
Father t2 = new Father();
//其他类的静态变量可以直接通过类名.静态变量名进行访问
System.out.println(t1.name);
System.out.println(t2);
}
}
//定义一个父类
class Father {
public static String name;
public int age;
public String eye;
public String height;
public String cutis;
public int i = 10;
//定义一个无参构造器
//无参构造器必须要有,否则不能编译成功
/*public Father() {
}*/
//定义一个有两个参数的构造器
//一般来说会有两个构造器,无参和有参,虽然有参构造器也是public类型,但是子类并不继承,Python中__init__初始化函数也不继承
/*public Father(String name, int age) {
this.name = name;
this.age = age;
}*/
//如果没有重写这个函数默认会输出类的地址好像是,重写之后输出的就是返回值
//此方法重写了Object类的toString方法
/*public String toString() {
String emp = name + " " + age;
return emp;
}*/
}
在这段代码中定义了一个父类和子类,两个类都分别定义了一个无参构造器和一个有参构造器。当父类没有定义无参构造器只是定义了一个有参构造器的时候,再去定义子类的有参构造器的时候就会报错。下面是一些解释:
因为你的父类已经定义了一个有参的构造函数并且父类中没有默认的无参构造方法,此时编译器不会为你调用默认的构造函数 ,父类中如果没有无参构造器则不能编译通过。
当子类继承时,必须在自己的构造函数显式调用父类的构造函数,自己才能确保子类在初始化前父类会被实例化
如果你父类中有无参的构造函数,子类就不会强制要求调用,即你写的那个就可以通过,
编译器会默认帮你调用父类的构造函数。
简单整理一下
-
如果父类有显式的无参构造函数,子类在构造函数的时候会默认调用父类的无参构造方法,无论父类还有没有有参构造函数。
-
如果父类想构建一个有参的构造函数,那么无参的构造函数一定要有,无论子类构不构造构造函数。
-
如果父类的有参和无参构造函数都存在,那么子类在构建构造函数的时候可以通过super()函数选择调用那个父类的哪个构造函数,里面有几个参数就表示调用哪个父类构造函数,默认的是调用无参的构造函数。
-
当然如果父类没有构造函数,子类也不能有构造函数。所以父类的无参构造函数一般都要写,无论子类需不需要构造函数。
-
一般来说,有参的构造函数和无参的构造函数会一起存在,子类的无参构造函数可以不写。