在学习构造方法之前,可能有初学者已经知道,当我们实例化一个Student对象的时候代码怎么写:
Student stu=new Student();
那么代码中Student()又代表什么意思呢?我们都知道,java代码中小括号都是代表方法的意思,那么Student()是个方法么?又是个什么方法呢?首先,它是一个方法,符合java语言中的语法设计,那它到底又是个什么方法呢?就是我们今天要了解的构造方法:它的写法是:
public class Student {
public Student(){
System.out.println("我是Student中的无参构造方法");
}
}
在测试类中运行:
public static void main(String[] args) {
new Student();
}
控制台会显示:
我们在构造方法中打印的一句话,证明我们在执行new Student()确实在调用构造方法,那么问题来, 我们之前没有写出这个构造方法之前,new Student()这行代码也可以顺利执行啊?这是因为,当我们创建一个类的时候,java虚拟机会自动帮我们创建一个 无参的构造函数(就是我们刚才写出来的那个),但是它是以隐式的方式存在的,就是说,它有了,但是不显示!
还有我们通过观察它的语法发现,它的语法构成 public Student()直接类名做为方法名,它并没有返回值,那么我们深入的理解一下,它真的没有返回值么?它为什么要这样设计呢?再看下面这句代码,是我们实例化的时候常写的:
public static void main(String[] args) {
Student student = new Student();
}
很明显,我们使用Student对象在接收实例化后的对象,所以说,调用构造方法的时候,它其实是返回了一个实例化的后的对象,构造方法的语法之所以这样设计是因为调用它就是固定返回一个它自己类型的对象,如果这里需要写返回值是不是有些多余?而且还存在乱写或者写错的风险,不得不说这个语法这样设计很严谨也很合理!
还有,有无参的构造方法,那就有有参的构造方法:
public class Student {
private String name;
private String gender;
public Student(){
System.out.println("我是Student中的无参构造方法");
}
public Student(String name, String gender) {
System.out.println("我是Student中的带参构造方法");
this.name = name;
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
public static void main(String[] args) {
Student student=new Student("jack", "男");
}
通过调用带参的构造方法,可以直接给我们指定的属性赋值,还有很重要的一个点,当我们:
public class Student {
private String name;
private String gender;
/* public Student(){
System.out.println("我是Student中的无参构造方法");
}*/
public Student(String name, String gender) {
System.out.println("我是Student中的带参构造方法");
this.name = name;
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
public static void main(String[] args) {
// Student student=new Student("jack", "男");
Student stu=new Student();
}
注释掉无参的构造方法,再像之前一样写Student student=new Student();的时候会报错,而且是编译错误,为什么呢?这是因为 当我们手动再类中写了有参的构造方法后,默认生成的这个无参的构造方法就不存在了,如果想要使用 还需要手动写出这个无参的构造方法就不会报错了,这是在实际使用中很容易忽略的一个问题,请各位初学者注意!