构造方法又叫构造器(constructor),是类的一种特殊的方法,它的主要作用是完成对新对象的初始化。
基本特征:
修饰符 方法名(形参列表){
方法体;
}
首先,让我们来看下面的一段代码
public class Person {
public String name;
public int age;
public void Display() {
System.out.println(name + " " + age);
}
public static void main(String[] args) {
Person person1 = new Person();
Person person2 = new Person();
person1.name = "张三";//代码冗余,重复
person1.age = 18;//
person2.name = "李四";//
person2.age = 28;//
person1.Display();
person2.Display();
}
//输出
//张三 18
//李四 28
}
那么此时,我们就有了一种需求
前面我们在创建人类的对象时,是先把一个对象创建好后,再给他的年龄和姓名属性赋值,如果现在我要求,在创建人类的对象时,就直接指定这个对象的年龄和姓名,该怎么做?
这时就可以使用构造方法。
public class Person {
public String name;
public int age;
//构造方法
public Person(String pname, int page) {
name = pname;
age = page;
System.out.println("构造方法被使用");
}
public void Display() {
System.out.println(name + " " + age);
}
public static void main(String[] args) {
Person person1 = new Person("张三",18);//直接通过构造方法完成初始化
Person person2 = new Person("李四",28);
person1.Display();
person2.Display();
}
}
输出结果:
可以看出来,构造方法被调用了两次
我们将上述Person类中的构造的方法,单独拉出来分析
public Person(String pname, int page) {
name = pname;
age = page;
}
分析结果:
既然构造方法与普通的方法如此类似,那它是否拥有类似的性质呢?
重载
- 一个类可以定义多个不同的构造器,即构造器重载。在调用对象时,编译器自动调用对应的构造方法。
比如:我们可以再给Person类定义一个构造器,用来创建对象的时候,只指定人名,不需要指定年龄。
只指定年龄,不需要指定人名。
public class Person {
public String name;
public int age;
public Person(String pname, int page) {
name = pname;
age = page;
System.out.println("构造方法被使用 name 和 age");
}
public Person(String pname) {
name = pname;
System.out.println("构造方法被使用 name");
}
public Person(int page) {
age = page;
System.out.println("构造方法被使用 age");
}
public void Display() {
System.out.println(name + " " + age);
}
public static void main(String[] args) {
Person person1 = new Person("张三",18);
Person person2 = new Person("李四");
Person person3 = new Person(28);
person1.Display();
person2.Display();
person3.Display();
}
}
输出结果:
可能有的初学者会疑惑,person2 中的 age 和 person3 中的 name 没有初始化,为何也打印出来了?
- 构造方法名和类名一定相同,没有返回值和返回类型。
- 构造方法是对对象的初始化,不是创建对象。(new 的时候对象已经被创建完毕,随后构造方法才开始被调用)
看下面一段代码
public class Person {
public String name;
public int age;
public void Display() {
System.out.println(name + " " + age);
}
public static void main(String[] args) {
Person person = new Person();
person.Display();
}
}
输出结果:
可能这时候有的读者会问,我没有构造方法,
那 Person person = new Person();中是不是就没有调用构造方法呢?
- 如果自己没有定义构造方法,系统会自动给类生成一个默认无参构造方法(也叫默认构造器)。
那么问题又出现了,若自己定义了构造方法,那默认的还存在吗?
若想继续使用,必须显式定义
public class Person {
public String name;
public int age;
public Person() {
//显示定义,自己将默认的写出来
//实际就是 重载
}
public Person(String pname, int page) {
name = pname;
age = page;
}
public void Display() {
System.out.println(name + " " + age);
}
public static void main(String[] args) {
Person person = new Person();//不报错
Person person1 = new Person("张三", 18);
person.Display();
person1.Display();
}
}
//输出结果
//null 0
//张三 18
梦想永在凌云意,意气风发。 代码筑就万世基,积沙镇海。
诸君加油(ง •_•)ง