- 构造方法的基础概念:
a. 构造方法在创建实例对象的时候调用
b. 如果一个类没有写构造方法,那么编译器会自动送一个默认的无参构造器给你
c. 只要你定义了一个构造方法,不论有参数没参数,编译器都不会再送你 - 对子类来说,如果没有写构造方法,那么编译器自动赠送一个,但是前提是父类存在无参构造方法(不论是父类中自己定义的还是编译器赠送的那个, 只要有就行)
- 如果父类中有无参构造方法,在子类中要定义一个构造方法的时候,编译器会自动赠送一个super()来访问父类的构造方法
父类:
public class inherit_test2 {
public inherit_test2(){
System.out.println("2 的构造方法");
}
}
子类:
public class inherit_test3 extends inherit_test2{
public inherit_test3() {
// super(); // 这个super写不写都行,不写的话编译器也会送你一个
System.out.println("3 的构造方法");
}
main执行:
public class inherit_test {
public static void main(String[] args) {
inherit_test3 zi = new inherit_test3();
}
}
执行后输出:
2 的构造方法
3 的构造方法
从上面的输出可以看到,明明只是实例化inherit_test3的对象,但是inherit_test2的构造方法也调用了。因为编译器自动给子类的构造方法加上了个super()来调用父类的构造方法
4. 如果父类中只定义了有参构造方法,没有无参构造方法,如下
public class inherit_test2 {
String a = "fua";
String b = "fub";
int c;
public inherit_test2(int num){
this.c = num;
System.out.println("2 的有参构造方法");
}
}
那么在子类中就必须定义一个构造方法,看如下的做法会报错,原因是父类中只有一个有参构造方法,没有默认的构造方法,所以在子类定义的构造方法必须用super()来访问父类构造方法,因为:必须确保构造子类对象的时候能够构造出父类, super()的作用就把父类中的构造方法拿过来构造父类,要是父类都创建不出来就不存在子类一说了
public class inherit_test3 extends inherit_test2{
String a = "zia";
String b = "zib";
public inherit_test3() { // 这里会报错,提示父类中没有无参构造方法
System.out.println("3 的构造方法");
}
}
用super来访问有参构造方法,需要注意的是:super必须在子类构造方法的第一行, 如下
public class inherit_test3 extends inherit_test2{
String a = "zia";
String b = "zib";
public inherit_test3() {
super(20); // 用super访问有参构造方法, 构造父类的时候需要传一个int,这里传了20,也就是传给了父类成员变量c
System.out.println("3 的构造方法");
}
}
- 在上面两个基础上再考虑子类的构造方法
这里给子类定义了俩构造方法,一个无参,一个俩参,但相同的点是:必须都有super()去访问父类的构造方法,换句话说,我能够确保能把父类构造出来,在这个基础上,那我子类的构造方法就又可以随便发挥了
public class inherit_test3 extends inherit_test2{
String a = "zia";
String b = "zib";
int d;
int e;
public inherit_test3() {
super(20);
System.out.println("3 的构造方法1");
}
public inherit_test3(int num, int num2, int num3) {
super(num);
this.d = num2;
this.e = num3;
System.out.println("3 的构造方法2");
}
}
- 访问本类中的另一个构造方法
父类:
public class inherit_test2 {
String a = "fua";
String b = "fub";
int c;
public inherit_test2(int num){
this.c = num;
System.out.println("2 的有参构造方法");
}
}
子类:
public class inherit_test3 extends inherit_test2{
String a = "zia";
String b = "zib";
int d;
int e;
public inherit_test3() {
super(20);
System.out.println("3 的构造方法1");
}
public inherit_test3(int num) {
this();
this.d = num;
System.out.println("3 的构造方法3");
}
}
main:
public static void main(String[] args) {
inherit_test3 zi = new inherit_test3(2);
}
在main中采用第三种构造方法,构造方法3中有this()首先调用本身类中的无参构造方法public inherit_test3(), 在这个方法里又先调用super(20)。所以这时候整体的打印运行顺序是:
a. System.out.println(“2 的有参构造方法”);
b. System.out.println(“3 的构造方法1”);
c. System.out.println(“3 的构造方法3”);
注意点: this 和super用在构造方法里的时候必须在第一行,所以这两者不能同时使用