详述
1、一个类中如果没有定义构造方法,默认有一个无参构造方法,其结构格式如下:
public 类名(){
super();
}
2、this([参数列表])调用本类构造方法,但必须放在有效代码行的第一行;而super([参数列表])调用父类构造方法,且也必须放在有效代码的第一行;所以一个构造方法中如果已经调用了本类构造方法,则该构造方法不能直接调用父类构造方法。即一个代码段中,this([参数列表])与super([参数列表]) 只可有一个出现。
public class Father {//父类
public Father() {
super();
System.out.println("父类构造方法");
}
}
public class Son extends Father{//子类
public Son(){
this("Jim");
System.out.println("子类构造方法");
}
public Son(String name) {
super();
System.out.println(name);
}
}
public class Text {
public static void main(String[] args) {
Son son = new Son();
}
}
3、如果子类构造方法没有调用本类构造方法,也没有指定调用父类构造方法,则默认调用父类无参构造方法。
注意:
父类中不可能有两个无参构造方法,可理解为,若在类中什么都不写系统会默认赠送一个无参构造方法,但是如果写了一个有参的方法,就不再赠送无参构造方法。
总结
a、如果父类 拥有 无参构造方法(无论隐式的还是显式的),且子类中的构造方法又没有明确指定调用父类的哪个构造方法,则子类中没有调用该子类其它构造方法的构造方法使用super()隐式调用父类的无参构造方法
public class Father {//父类
public Father() {
super();
System.out.println("父类构造方法");
}
}
public class Son extends Father{//子类
public Son(){
System.out.println("子类构造方法");
}
public Son(String name) {
this();
System.out.println(name);
}
}
public class Text {
public static void main(String[] args) {
Son son = new Son("Jim");
}
}
输出结果为:
父类构造方法
子类构造方法
Jim
在Text类的main方法中,调用Son(String name)时,this调用了Son()函数,而子类的无参构造方法默认调用父类中的无参构造方法,从而由以上输出结果。
b、如果父类* 没有* 无参构造方法(无论隐式的还是显式的),则要求子类构造方法必须直接或间接指定调用父类哪个构造方法并且放在有效代码第一行
public class Father {//父类
String height;
String name;
public Father(String height,String name){
this.name = "wjq";
this.height = 165;
}
public Father(String name) {
this.name = "wjq";
}
}
public class Son extends Father{//子类
String height = "165";
String name = "wjq";
public Son(String height,String name){
super(name);
System.out.println(name);
}
public Son(String name) {
this(height,name)
System.out.println(name);
}
}
public class Text {
public static void main(String[] args) {
Son son = new Son("Jim");
}
}