廖雪峰Java2-2数据封装-2构造方法

时间:2022-01-20 13:17:56

在2-2-1中,创建1个实例需要3步

        Person ming = new Person();
ming.setName(" 小明 ");
ming.setAge(16);

问题:能否在创建对象实例时就把内部字段全部初始化为合适的值?

构造方法因此应运而生

1.单个构造方法

  • 构造方法可以在创建对象实例时初始化对象实例
  • 构造方法名就是类名
  • 构造方法的参数没有限制
  • 构造方法没有返回值(也没有void)
  • 必须用new操作符调用构造方法

    Person.java
public class Person {
private String name;
private int age;
public Person(String name,int age) {
this.name = name;
this.age = age;
}
public void info() {
System.out.printf("我是%s,今年%d岁" ,name,age);
}
}

Hello.java

public class Hello {
public static void main(String[] args) {
Person ming = new Person("小明",12);
ming.info();
}
}

廖雪峰Java2-2数据封装-2构造方法

如果一个类没有定义构造方法,编译器会自动生成一个默认构造方法:
* 无参数
* 无执行语句
```#java
public Person() { }
```
如果我们定义了构造方法,编译器不会再自动创建默认的构造方法

构造方法初始化顺序:

  • 先初始化字段
  • 没有赋值的字段初始化为默认值:基本类型=0;引用类型=null
  • 再执行构造方法的代码

多个构造方法

可以定义多个构造方法,编译器通过构造方法的参数数量、位置和类型区分

一个构造方法可以调用其他构造放方法,便于代码复用。

调用其他构造方法的语法是this(...)

Person.java

public class Person {
private String name;
private int age;
public Person(String name,int age) {
this.name = name;
this.age = age;
}
public Person(String name) {
this(name,18);
}
public Person() {
this("Unnamed");
}
public void info() {
System.out.printf("我是%s,今年%d岁\n" ,name,age);
}
}

Hello.java

public class Hello {
public static void main(String[] args) {
Person ming = new Person("小明",12);
ming.info();
Person hong = new Person("小红");
hong.info();
Person jun = new Person();
jun.info();
}
}

廖雪峰Java2-2数据封装-2构造方法

3.总结:

实例在创建时会调用构造方法

构造方法用于初始化实例

没有定义构造方法时,编译器会自动创建默认的构造方法。

可以定义多个构造方法,编译器根据参数自动判断