1. 父类有无参构造方法,子类才可以写无参构造方法;父类有含参构造方法,子类才可以写含参构造方法
2. 构造方法不能被继承、重写
3. 当调用无参构造方法时,先调用父类无参构造方法,然后调用子类无参构造方法;当调用含参构造方法时,先调用父类含参构造方法,然后调用子类含参构造方法。
注意:子类不显式调用父类的构造方法时,编译器会默认调用父类的无参构造方法
非继承关系中的初始化顺序
1.static静态代码块和静态成员
2.普通成员
3.构造函数执行
继承关系中的初始化顺序
1.父类静态代码区和父类静态成员
2.子类静态代码区和子类静态成员
3.父类非静态代码区和普通成员
4.父类构造函数
5.子类非静态代码区和普通成员
6.子类构造函数
例:
package com.xuenixiang.web;
public class Super1 {
protected String name;
private String address;
public Super1() {
System.out.println("父类无参构造被调用");
}
public Super1(String name,String address) {
System.out.println("父类有参构造被调用");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
package com.xuenixiang.web;
public class Super2 extends Super1 {
private int age;
public Super2() {
System.out.println("子类无参构造被调用");
}
public Super2(String name, String address) {
//super(name,address);
System.out.println("子类有参构造被调用");
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String Mingzi) {
this.name = Mingzi; // 子类对父类的setName进行重写
System.out.println("父类的setName方法被重写");
}
public void xuenixiang() {
System.out.println("网站名:" + this.getName());
System.out.println("网站地址:" + this.getAddress());
System.out.println("网站年龄:" + this.getAge());
}
public static void main(String[] args) {
Super2 xnx = new Super2("学逆向论坛","www.xuenixiang.com");
xnx.setName("学逆向论坛");
xnx.setAddress("www.xuenixiang.com");
xnx.setAge(1);
xnx.xuenixiang();
}
}
没有显示调用父类构造方法,所以父类的无参构造方法被默认加载
显示的调用父类的有参构造方法
更详细的原理和步骤参考这两篇文章
https://blog.csdn.net/u011080472/article/details/51330114
https://blog.csdn.net/whut2010hj/article/details/81330381