构造器就是一种特殊的方法,特殊在:
只要声明了这么一个特殊的方法,那么这个方法就不叫方法,叫做构造器了
Student s = new Student();
?执行上面这个语句时会做两个动作,new Student代表在堆区创建一个对象,()其实也代表一个动作,代表告诉前面创建的对象去调用哪个构造器(构造器也分多种,由重载区分,不理解重载可以看这个java方法重载--学习笔记-CSDN博客)执行public class Student {
String name;
double score;
//无参构造器
public Student(){
System.out.println("无参构造器执行");
}
//有参构造器
public Student(String name, double score){
System.out.println("有参构造器执行");
}
}
? 然后new一个新对象:
?
public class Test {
public static void main(String[] args) {
Student s = new Student();
}
}
可以看到,在创建对象时,确实会根据小括号决定执行哪个构造器,由于小括号里面并没有填实参,所以调用了无参构造器
假如我们在小括号里面输入一些参数,再看结果:
public class Test {
public static void main(String[] args) {
Student s = new Student("泽予",666);
}
}
可以看到,确实是根据小括号里面的实参来决定选择哪个构造器
不使用构造器初始化情况:
Student s = new Student();
s.name = "泽予";
s.score = 666;
可以看到是比较繁琐的,只是俩个还好,假如同时给几十上百个成员变量赋初值,难道每个都单独写出来吗?那太麻烦了
再看看使用构造器的情况,先完善一下构造器:
//有参构造器
public Student(String name, double score){
this.name = name;
this.score = score;
System.out.println("有参构造器执行");
}
不理解this的可以看这篇:https://blog.csdn.net/m0_71386740/article/details/135257881?spm=1001.2014.3001.5502
然后new一个对象的同时使用构造器赋初值:
Student s = new Student("泽予",666);
可以看到,同样的效果,以前用了三行,现在只需要一句语句就可以完成,非常清爽,优雅
public class Teacher {
}
可以看到,里面什麽都没有,然后我们再调用无参构造器:
可以看到,这么做是没有任何问题的,我们知道,在new一个对象时小括号不填参数其实会自动调用无参构造器,但是类中并没有写无参构造器,说明在没有写无参构造器时系统确实会帮我们自动创建一个无参构造器
一旦定义了有参构造器,系统就不会帮我们自动生成无参构造器了
在Teacher中写一个有参构造器:
可以看到已经开始报错了,我们再看看无参构造器调用语句
这句话意思就是Teacher类中只有一个带String的有参构造器,你不能去调用无参构造器,所以说,在我们只写了有参构造器的情况下,去调用无参构造器是会报错的,这个时候最好是自己顺手写一个无参构造器