目录
- 子类构造函数,什么时候需要写,什么时候可以不写?
- 为什么要这么设计?
- 子类已经继承父类,为什么就不能继承父类的构造器了?子类直接用父类的构造器不就行了?
子类构造函数,什么时候需要写,什么时候可以不写?
- 父类没写默认构造器,也没有有参构造器,子类以不写构造器。(此时编译器,有自动添加默认构造器。)
public class Test {class Father{public String name;}class Son extends Father {}public static void main(String[] args) {}}
- 父类有默认构造器,但是没有有参构造器,子类也可以不写构造器。(此时编译器,自动添加。)
public class Test {class Father {public String name;Father() {this.name = "xxx";}}class Son extends Father {}public static void main(String[] args) {}
}
- 父类有默认构造器,也有有参构造器,子类可以不写构造器。(此时编译器,自动添加。)
public class Test {class Father {public String name;Father() {this.name = "xxx";}Father(String n) {this.name = n;}}class Son extends Father {}public static void main(String[] args) {}
}
- 父类没有默认构造器,只有有参构造器,此时子类必须添加构造器。否在会提示:父类没有可用的构造函数。
必须写一个构造函数,来显示调用父类的某个有参构造器。如下:
public class Test {class Father {public String name;Father(String n) {this.name = n;}}class Son extends Father {Son(String n) {super(n);}}public static void main(String[] args) {}
}
总结下:
父类没有默认构造器,只有有参构造器,此时子类必须添加构造器,显示调用父类构造器。
为什么要这么设计?
父类没有默认构造器,只有有参构造器,说明父类对象生成时,必须要传递一个参数。这个参数从哪里传入了?只能是子类构造器,所以子类必须要有一个构造器,有参无参都行。
子类已经继承父类,为什么就不能继承父类的构造器了?子类直接用父类的构造器不就行了?
构造函数名要求和类名一致,子类如果继承了父类的构造函数,那这个函数的名字和子类就不一样了。不符合构造函数的要求。
子类能不能继承父类的构造函数
如果想从.class文件入手,梳理构造函数,可以参考:
Java的构造函数与默认构造函数(深入版)