1. 构造器(Constructor)

1.1 概念

  • 1.1.1 定义:构造器是一种特殊的方法,在创建对象时自动调用,用于初始化对象的属性
  • 1.1.2 与普通方法的区别:构造器名必须与类名完全一致,且没有返回值类型(连 void 也不写)

1.2 格式

  • 1.2.1 无参构造器
  public 类名() {
  }
  • 1.2.2 有参构造器
  public 类名(数据类型 变量名, ...) {
      this.成员变量 = 变量名;
  }

1.3 系统默认规则

  • 1.3.1 不写任何构造器:系统自动提供一个无参构造器
  • 1.3.2 已写任意构造器:无论有参无参,系统不再自动提供无参构造器,需手动补写

1.4 构造器重载

构造器同样支持重载,同一类中可以同时存在无参和有参构造器。

  • 1.4.1 示例
  public Student() {
  }
 
  public Student(int age, String name, String gender) {
      this.age = age;
      this.name = name;
      this.gender = gender;
  }

1.5 与 getter / setter 配合使用

  • 1.5.1 有参构造器:创建对象时直接完成属性初始化,适合创建时就确定属性值的场景
  • 1.5.2 无参构造器 + setter:创建后再逐个赋值,适合属性值需要动态修改的场景
  // 有参构造器方式
  Student stu = new Student(20, "锦涛", "男");
 
  // 无参 + setter 方式
  Student stu1 = new Student();
  stu1.setAge(20);
  stu1.setName("锦涛");

1.6 匿名对象

  • 1.6.1 定义:没有名字的对象,只有 new 赋值,没有变量声明接收其地址
  • 1.6.2 特点:因为无法获得该对象的地址,只能使用一次,使用完毕后立即标记为垃圾对象等待 GC 回收,释放内存节约资源
  • 1.6.3 示例
  new Student().show();          // 调用一次方法后即成垃圾对象
  new Student().setAge(20);      // 赋值后无法再获取,意义不大
  System.out.println(new Student().getAge()); // 每次 new 都是全新对象
  • 1.6.4 每次 new 都是独立对象:多次匿名创建同参数对象,地址值不同,== 比较结果为 false
  Student s1 = new Student(20, "张三", "男");
  Student s2 = new Student(20, "张三", "男");
  System.out.println(s1 == s2); // false,两个独立内存地址

2. 示例代码

2.1 Demo03

package com.itszt.day04;
 
public class Demo03 {
    public static void main(String[] args) {
        // 有参构造器:创建对象时直接初始化属性
        Student stu = new Student(20, "锦涛", "男");
        System.out.println(stu.getName());   // 锦涛
        System.out.println(stu.getAge());    // 20
        System.out.println(stu.getGender()); // 男
 
        // 无参构造器
        Student stu1 = new Student();
    }
}
 
class Student {
    private int age;
    private String name;
    private String gender;
 
    public Student() {
    }
 
    public Student(int age, String name, String gender) {
        this.age = age;
        this.name = name;
        this.gender = gender;
    }
 
    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }
    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 void show() {
        System.out.println("1000行代码");
    }
}

2.2 Demo04

package com.itszt.day04;
 
public class Demo04 {
    public static void main(String[] args) {
        // 匿名对象:只能使用一次,用完即成垃圾对象
        new Student().show();
        new Student().setAge(20);
        System.out.println(new Student().getAge());
 
        // 每次 new 都是独立对象,地址不同
        Student s1 = new Student(20, "张三", "男");
        Student s2 = new Student(20, "张三", "男");
        System.out.println(s1 == s2); // false
        System.out.println(s1);
        System.out.println(s2);
    }
}

3. 总结

知识点核心要点
构造器作用创建对象时自动调用,初始化属性
命名规则与类名完全一致,无返回值类型
无参构造器不写任何构造器时系统自动提供
有参构造器已写任意构造器后系统不再自动提供无参构造器
构造器重载无参和有参可同时存在
this区分同名成员变量与参数
匿名对象无变量接收,只能使用一次,用完等待 GC 回收
== 比较对象比较的是地址值,内容相同但地址不同则为 false