Java中的构造器的作用是什么?
今天看到一个问题,那就是Java中的构造器的作用是什么,第一反应是:嗯?构造器?不就是构造方法嘛,只是只是叫法不一样,但是习惯喊构造方法的我还是忍不住吐槽了,回归正题,用简单来说构造器的作用就是:
- 创建对象
- 初始化成员变量
那么问题来了,构造方法的特点有哪些呢:
- 首先是构造方法的方法名要与类名一致
- 构造方法分为:有参构造方法和无参构造方法
- 构造方法无返回类型,void类型也不可以
- 构造方法是不能被继承的,但是可以使用super来调用,且super必须声明在在子类构造方法中的首行
- 默认有一个无参构造方法,当自定义无参构造方法的时候,默认则无效
- 可以没有构造方法(编译器默认有一个无参构造方法),也可以有多个构造方法,他们之间构成重载关系
一开始学习JavaSE的时候,对于构造方法的概念还十分模糊,也不知道怎么用,在哪儿用,只会盲目的写差不多的getter setter方法模板:
public class ConstructionDemo5 {
private String name;
private int number;
private double score;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
public static void main(String[] args) {
ConstructionDemo5 constructionDemo5=new ConstructionDemo5();
constructionDemo5.setName("杜");
constructionDemo5.setNumber(21);
constructionDemo5.setScore(97.4);
System.out.println("我是"+ constructionDemo5.name+",我学号是:"+ constructionDemo5.number+",我这次成绩是:"+ constructionDemo5.score);
}
}
我是杜,我学号是:21,我这次成绩是:97.4
Process finished with exit code 0
从上面的代码看来,new对象,调用set方法赋值,这看起来似乎没什么问题,但是在需要给更多的成员变量赋值的时候,实例化更多对象的时候,就很容易造成纰漏,上面的方法是会增加我们的工作量,并且冗长的代码也不适宜阅读,那该怎么办呢?
这时候就要用到构造方法了
public class ConstructionDemo6 {
private String name;
private int number;
private double score;
public ConstructionDemo6(String name, int number, double score) {
this.name = name;
this.number = number;
this.score = score;
}
public static void main(String[] args) {
ConstructionDemo6 construction=new ConstructionDemo6("杜",1,99.9);
System.out.println("我是"+ construction.name+",我学号是:"+ construction.number+",我这次成绩是:"+ construction.score);
}
}
我是杜,我学号是:1,我这次成绩是:99.9
Process finished with exit code 0
上面的例子中用到了有参构造方法,通过构造方法我们可以避免了忘给某些成员变量赋值的问题。
关于构造方法,一开始我说到分为有参构造方法和无参构造方法,默认有一个无参构造方法,当自定义无参构造方法的时候,默认则无效可以没有构造方法(编译器默认有一个无参构造方法),也可以有多个构造方法,他们之间构成重载关系。
下面我举出相关例子:
package com.JavaSe.Demo;
/**
* @Description TODO
* @Author Du
* @Date 2021/5/28 18:27
*/
public class ConstructionDemo {
//定义类Construction1 自己不手动添加任何无参或有参数构造方法
static class Construction1{
private int age;
private String name;
private String sex;
}
//定义类Construction2 自己添加无参的构造方法
static class Construction2{
private int age;
private String name;
private String sex;
public Construction2(){
System.out.println("无参构造方法被调用");
}
}
//定义类Construction3 有参数的构造方法
static class Construction3{
private int age;
private String name;
private String sex;
public Construction3(String name, String sex, int age ){
this.name = name ;
this.sex = sex;
this.age = age;
}
}
//定义类Construction4 自己添加无参的构造方法,和有参数的构造方法
static class Construction4{
private int age;
private String name;
private String sex;
//不带参数的构造函数,可以被重载
public Construction4(){
System.out.println("无参构造方法被调用");
}
//带参数对的构造函数
public Construction4(String name, String sex, int age ){
this.name = name;
this.sex = sex;
this.age = age;
}
//方法重载
public Construction4(String name,double score){
this.name=name;
}
}
public static void main(String[] args) {
Construction1 construction1 = new Construction1();//编译通过;①实例化Person对象 ②自动调用构造方法Construction( )
Construction2 construction2 = new Construction2();//编译通过;打印: 无参构造方法被调用
// 这样写,编译器会报错,原因是系统默认的无参构造方法被有参构造方法覆盖,编译器不能再提供无参构造方法
Construction3 construction3 = new Construction3();
//Person4 Construction4 = new Person4();//编译通过;打印: 无参构造方法被调用
Construction4 Construction4 = new Construction4("qzz", "man", 18);//编译通过;
}
}