Java 构造函数 super问题

  1. 父类,子类均没有提供构造函数 => 编译器会分别为父类,子类生成一个默认的无参数的构造函数
  2. 父类没有提供构造函数,子类提供无参数构造函数 => 子类构造函数无需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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值