Java - 16 构造器
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;
}
}
- 构造器的修饰符可以默认,也可以是public, protected, private
- 构造器没有返回值,也不能写void
- 构造器方法名和类名必须一样
- 构造器的参数列表和成员方法的参数列表一样的规则
- 在创建对象时,系统会自动的调用该类的构造器完成对象的初始化
细节
- 构造器重载:一个类可以定义多个不同的构造器
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);
-
在方法区中加载Person类信息,只会加载一次
-
在堆中分配空间(地址)
-
完成对象初始化 [3.1 默认初始化: age = 0; name = null]
[3.2 显式初始化: age = 90; name = null]
[3.3 构造器初始化: age = 20; name = “小吴”(是个地址,指向方法区中常量池的“小吴”)]
- 把对象在堆中的地址返回给栈中的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;
}
}