我们new完对象时,所有成员变量都是默认值,如果我们需要赋别的值,需要挨个为它们再赋值,太麻烦了。我们能不能在new对象时,直接为当前对象的某个或所有成员变量直接赋值呢?

可以,Java给我们提供了构造器(Constructor),也称为构造方法

10.1 构造器的作用

new对象,并在new对象的时候为实例变量赋值。

举例:Person p = newPerson(“Peter”,15);

解释:如同我们规定每个“人”一出生就必须先洗澡,我们就可以在“人”的构造器中加入完成“洗澡”的程序代码,于是每个“人”一出生就会自动完成“洗澡”,程序就不必再在每个人刚出生时一个一个地告诉他们要“洗澡”了。

10.2 构造器的语法格式

[修饰符] class 类名{    [修饰符] 构造器名(){    // 实例初始化代码    }    [修饰符] 构造器名(参数列表){        // 实例初始化代码    }}

说明:

  1. 构造器名必须与它所在的类名必须相同。
  2. 它没有返回值,所以不需要返回值类型,也不需要void。
  3. 构造器的修饰符只能是权限修饰符,不能被其他任何修饰。比如,不能被static、final、synchronized、abstract、native修饰,不能有return语句返回值。

代码如下:

public class Student {    private String name;    private int age;    // 无参构造    public Student() {}    // 有参构造    public Student(String n,int a) {        name = n;        age = a;    }    public String getName() {        return name;    }    public void setName(String n) {        name = n;    }    public int getAge() {        return age;    }    public void setAge(int a) {        age = a;    }    public String getInfo(){        return "姓名:" + name +",年龄:" + age;    }}
public class TestStudent {    public static void main(String[] args) {        //调用无参构造创建学生对象        Student s1 = new Student();        //调用有参构造创建学生对象        Student s2 = new Student("张三",23);        System.out.println(s1.getInfo());        System.out.println(s2.getInfo());    }}

10.3 使用说明

  1. 当我们没有显式的声明类中的构造器时,系统会默认提供一个无参的构造器并且该构造器的修饰符默认与类的修饰符相同

  2. 当我们显式的定义类的构造器以后,系统就不再提供默认的无参的构造器了。

  3. 在类中,至少会存在一个构造器。

  4. 构造器是可以重载的。

10.4 练习

**练习1:

**编写两个类,TriAngle和TriAngleTest,其中TriAngle类中声明私有的底边长base和高height,同时声明公共方法访问私有变量。此外,提供类必要的构造器。另一个类中使用这些公共方法,计算三角形的面积。

练习2:

(1)定义Student类,有4个属性:
String name;
int age;
String school;
String major;

(2)定义Student类的3个构造器:

  • 第一个构造器Student(String n, int a)设置类的name和age属性;
  • 第二个构造器Student(String n, int a, String s)设置类的name, age 和school属性;
  • 第三个构造器Student(String n, int a, String s, String m)设置类的name, age ,school和major属性;

(3)在main方法中分别调用不同的构造器创建的对象,并输出其属性值。

练习3:

1、写一个名为Account的类模拟账户。该类的属性和方法如下图所示。

该类包括的属性:账号id,余额balance,年利率annualInterestRate;

包含的方法:访问器方法(getter和setter方法),取款方法withdraw(),存款方法deposit()。

**提示:**在提款方法withdraw中,需要判断用户余额是否能够满足提款数额的要求,如果不能,应给出提示。

  1. 创建Customer类。

a. 声明三个私有对象属性:firstName、lastName和account。
b. 声明一个公有构造器,这个构造器带有两个代表对象属性的参数(f和l)
c. 声明两个公有存取器来访问该对象属性,方法getFirstName和getLastName返回相应的属性。
d. 声明setAccount 方法来对account属性赋值。
e. 声明getAccount 方法以获取account属性。

3.写一个测试程序。

(1)创建一个Customer ,名字叫 Jane Smith, 他有一个账号为1000,余额为2000元,年利率为 1.23% 的账户。
(2)对Jane Smith操作。
存入 100 元,再取出960元。再取出2000元。
打印出Jane Smith 的基本信息

成功存入 :100.0成功取出:960.0余额不足,取款失败Customer [Smith, Jane] has a account: id is 1000, annualInterestRate is 1.23%, balance is 1140.0