- 父类,子类均没有提供构造函数 => 编译器会分别为父类,子类生成一个默认的无参数的构造函数
- 父类没有提供构造函数,子类提供无参数构造函数 => 子类构造函数无需super()
class Father {
}
class Child extends Father {
Child() {
System.out.println("这是子类的无参数构造函数");
}
}
public class Main {
public static void main(String[] args) {
new Child();
}
}
输出:这是子类的无参数构造函数
3. 父类没有提供构造函数,子类提供有参数构造函数 => 子类构造函数无需super()
class Father {
}
class Child extends Father {
Child(int age) {
System.out.println("这是子类的有参数构造函数");
}
}
public class Main {
public static void main(String[] args) {
new Child(1);
}
}
输出:这是子类的有参数构造函数
4. 父类提供无参数构造函数,子类提供无参数构造函数 => 子类构造函数无需super()且子类实例化时,先执行父类的无参数构造函数,再执行子类的无参数构造函数
class Father {
Father() {
System.out.println("这是父类的无参数构造函数");
}
}
class Child extends Father {
Child() {
System.out.println("这是子类的无参数构造函数");
}
}
public class Main {
public static void main(String[] args) {
new Child();
}
}
输出:这是父类的无参数构造函数
这是子类的无参数构造函数
5. 父类提供无参数构造函数,子类提供有参数构造函数 => 子类构造函数无需super()且子类实例化时,先执行父类的无参数构造函数,再执行子类的有参数构造函数
class Father {
Father() {
System.out.println("这是父类的无参数构造函数");
}
}
class Child extends Father {
Child(int age) {
System.out.println("这是子类的有参数构造函数");
}
}
public class Main {
public static void main(String[] args) {
new Child(1);
}
}
输出:这是父类的无参数构造函数
这是子类的有参数构造函数
6. 父类提供有参数构造函数,子类不能提供无参数构造函数
7. 父类提供有参数构造函数,子类提供有参数构造函数 => 子类构造函数需要super()且子类实例化时,先执行父类的有参数构造函数,再执行子类的有参数构造函数
class Father {
Father(int age) {
System.out.println("这是父类的有参数构造函数");
}
}
class Child extends Father {
Child(int age) {
super(age);
System.out.println("这是子类的有参数构造函数");
}
}
public class Main {
public static void main(String[] args) {
new Child(1);
}
}
输出:这是父类的有参数构造函数
这是子类的有参数构造函数
8. 父类既提供无参数构造函数,又提供有参数构造函数 => 子类构造函数无需super()且子类实例化时,先执行父类的无参数构造函数,再执行子类的无参数构造函数
class Father {
Father() {
System.out.println("这是父类的无参数构造函数");
}
Father(int age) {
System.out.println("这是父类的有参数构造函数");
}
}
class Child extends Father {
Child() {
System.out.println("这是子类的无参数构造函数");
}
}
public class Main {
public static void main(String[] args) {
new Child();
}
}
输出:这是父类的无参数构造函数
这是子类的无参数构造函数
class Father {
Father() {
System.out.println("这是父类的无参数构造函数");
}
Father(int age) {
System.out.println("这是父类的有参数构造函数");
}
}
class Child extends Father {
Child(int age) {
System.out.println("这是子类的有参数构造函数");
}
}
public class Main {
public static void main(String[] args) {
new Child(1);
}
}
输出:这是父类的无参数构造函数
这是子类的有参数构造函数
class Father {
Father() {
System.out.println("这是父类的无参数构造函数");
}
Father(int age) {
System.out.println("这是父类的有参数构造函数");
}
}
class Child extends Father {
Child(int age) {
super(age);
System.out.println("这是子类的有参数构造函数");
}
}
public class Main {
public static void main(String[] args) {
new Child(1);
}
}
输出:这是父类的有参数构造函数
这是子类的有参数构造函数
总结:
1. 父类没有提供构造函数,或者父类提供了无参构造函数,那么子类无需考虑super()
2. 只要父类中只存在有参数构造函数,那么子类必须考虑super()
本文详细解析了Java中父类与子类构造函数的调用机制,包括无需使用super的情况及必须显式调用super的场景,并通过具体示例说明了不同构造函数组合下子类实例化的执行流程。
2165

被折叠的 条评论
为什么被折叠?



