Java - 16 构造器

wxrwajiez / 2024-10-19 / 原文

Java - 16 构造器 constructor

  • 完成对新对象的初始化,不是创造对象

  • 本质是方法

public class Constructor{
	public static void main(String[] args){
		Person p1 = new Person("dabao", 2);
        System.out.println(p1.name);
        System.out.println(p1.age);
    }
}

class Person{
	String name;
    int age;
    
    public Person(String pName, int pAge){
		name = pName;
        age = pAge;
    }
}
  1. 构造器的修饰符可以默认,也可以是public, protected, private
  2. 构造器没有返回值,也不能写void
  3. 构造器方法名和类名必须一样
  4. 构造器的参数列表和成员方法的参数列表一样的规则
  5. 在创建对象时,系统会自动的调用该类的构造器完成对象的初始化

细节

  • 构造器重载:一个类可以定义多个不同的构造器
class Person{
	String name;
    int age; // 默认0
    
    public Person(String pName, int pAge){
		name = pName;
        age = pAge;
    }
    public Person(String pName){
		name = pName;
    }
}
  • 如果没有定义构造器,系统会自动给类生成一个默认无参构造器(默认构造器)
class Dog{
	/*
	Dog(){

	}
	*/
}

javap反编译字节码Dog.class,可以看到源文件有默认构造器

  • 一旦定义了自己的构造器,默认构造器就被覆盖了(不能使用了),除非显式地定义一下 Dog(){}

对象创建的流程分析

class Person{
	int age = 90;
    String name;
    Person(String n, int a){
		name = n;
        age = a;
    }
}
Person p = new Person("小吴", 22);
  1. 在方法区中加载Person类信息,只会加载一次

  2. 在堆中分配空间(地址)

  3. 完成对象初始化 [3.1 默认初始化: age = 0; name = null]

    ​ [3.2 显式初始化: age = 90; name = null]

​ [3.3 构造器初始化: age = 20; name = “小吴”(是个地址,指向方法区中常量池的“小吴”)]

  1. 把对象在堆中的地址返回给栈中的p变量

练习

复用构造器

class Employee{
    String name;
    int age;
    char gender;
    String job;
    double sal;
    
    public Employee(String job, double sal){
        this.job = job;
        this.sal = sal;
    }
    public Employee(String name, char gender, int age){
        this.name = name;
        this.gender = gender;
        this.age = age;
    }
    public Employee(String job, double sal, String name, char gender, int age){
        this(name, gender, age); // this访问本类的构造器必须放在第一条语句,所以只能用一个
        this.job = job;
        this.sal = sal;
    }
}