查看: 243|回复: 0

[Java学习] Java 无参数构造函数的应用

发表于 2018-5-6 08:59:34

创建类时指定了有参数构造函数后,系统默认不会创建无参数构造函数,需要自己手动创建。

创建子类的对象实例时,默认会先调用父类的无参数的构造函数(默认构造函数)。

若父类未定义无参数构造函数,则在编译阶段报错。

若子类指定了父类的有参构造函数,则可以通过编译和运行。

子类声明super(id, city)显示调用父类有参构造函数

  1. package cn.lw.testpkg;
  2. /**
  3. * @author wanglei 2018年4月18日
  4. */
  5. class Predessor {
  6. private int id;
  7. private String city;
  8. public Predessor(int id, String city) {
  9. this.id = id;
  10. this.city = city;
  11. }
  12. @Override
  13. public String toString() {
  14. return "Predessor [id=" + id + ", city=" + city + "]";
  15. }
  16. }
  17. class Successor extends Predessor {
  18. private String name;
  19. private String sex;
  20. public Successor(String name, String sex, int id, String city) {
  21. super(id, city);
  22. this.name = name;
  23. this.sex = sex;
  24. }
  25. @Override
  26. public String toString() {
  27. return "Successor [name=" + name + ", sex=" + sex + "]";
  28. }
  29. }
  30. public class CallConstructorTest {
  31. public static void main(String[] args) {
  32. Successor s2 = new Successor("A", "male", 1, "HZ");
  33. System.out.println(s2);
  34. }
  35. }
复制代码

输出

Successor [name=A, sex=male]

父类未定义无参数构造函数,子类不声明super(id, city)

  1. public Successor(String name, String sex) {
  2. this.name = name;
  3. this.sex = sex;
  4. }
复制代码

编译报错

Implicit super constructor Predessor() is undefined. Must explicitly invoke another constructor

父类显示定义无参数构造函数,方法调用的传递性

  1. package cn.lw.testpkg;
  2. /**
  3. * @author wanglei 2018年4月18日
  4. */
  5. class Predessor {
  6. private int id;
  7. private String city;
  8. public Predessor() {
  9. System.out.println("调用了 Predessor 无参的构造函数");
  10. }
  11. public Predessor(int id, String city) {
  12. this.id = id;
  13. this.city = city;
  14. }
  15. @Override
  16. public String toString() {
  17. return "Predessor [id=" + id + ", city=" + city + "]";
  18. }
  19. }
  20. class Successor extends Predessor {
  21. private String name;
  22. private String sex;
  23. public Successor() {
  24. System.out.println("调用了 Successor 无参的构造函数");
  25. }
  26. public Successor(String name, String sex) {
  27. this.name = name;
  28. this.sex = sex;
  29. }
  30. @Override
  31. public String toString() {
  32. return "Successor [name=" + name + ", sex=" + sex + "]";
  33. }
  34. }
  35. public class CallConstructorTest {
  36. public static void main(String[] args) {
  37. Successor s = new Successor();
  38. System.out.println(s);
  39. System.out.println("--------------");
  40. Successor s2 = new Successor("A", "male");
  41. System.out.println(s2);
  42. }
  43. }
复制代码

输出

调用了 Predessor 无参的构造函数
调用了 Successor 无参的构造函数
Successor [name=null, sex=null]
--------------
调用了 Predessor 无参的构造函数
Successor [name=A, sex=male]

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持程序员之家。



回复

使用道具 举报