构造器
785字约3分钟
2024-12-02
构造器
class Person {
String name = "jack";
int age = 18;
// 构造器
// 构造器的名字要和类名字一样
// 构造器不需要写返回值
// Person(形参列表) ,构造器中的形参列表的规则和成员方法一样
public Person(String pName, int pAge) {
System.out.println("构造器已被调用");
name = pName;
age = pAge;
}
}
public class Constructor01 {
public static void main(String[] args) {
// 直接通过构造器指定名字,完成对象的初始化
Person p1 = new Person("hello", 20);
System.out.println("name:" + p1.name); // 输出 hello
System.out.println("age:" + p1.age); // 输出 20
}
}
构造器的使用细节
class Person {
String name = "jack";
int age = 10;
public Person(String pName, int pAge) {
name = pName;
age = pAge;
}
// 构造器实现方法重载
// 构造器不需要写返回值
// 构造器是对对象初始化,而不是重新创建对象
public Person(String pName) {
name = pName;
}
}
public class Constructor02 {
public static void main(String[] args) {
// 所以构造器的值就在创建对象这里输入即可
Person p1 = new Person("hello", 20);
Person p2 = new Person("world");
/*
在创建对象的时候,系统会自动调用该类的构造方法
不需要我们手动干预
除非是调用成员方法,才需要我们手动干预
p2.Person("world");
*/
System.out.println("p1.name: " + p1.name);
System.out.println("p1.age: " + p1.age);
System.out.println("p2.name: " + p2.name);
}
}
class Person {
}
class Person1 {
public Person1(String name) {
}
}
public class Constructor03 {
public static void main(String[] args) {
// 因为Person这个类中没有任何参数
// 所以这个类是无参构造器,所以就不需要写任何值
// 一个类中如果什么都没有写,那么就会有一个默认的无参构造器,默认是不会显示的
Person p1 = new Person();
// 因为Person这个类里面有构造器
// 所以就会覆盖掉默认的无参构造器
// 所以原来的默认的无参构造器就无法使用了,除非自己定义一个无参构造器
Person1 p2 = new Person1("Hello");
/*
由于没有写无参构造器,所以这里就不能调用无参构造器
Person1 p2 = new Person1();
*/
}
}
构造器执行流程图
执行流程
- 首先加载类信息,只会加载一次(
Person.class
这个类) - 在堆中分配空间
- 完成对象初始化(
age
默认是0,name默认是null(就是没有地址)) - 在显示初始化,也就是类里面的属性赋的值(
age
= 90 ,name
= null),所以age
就等于90,因为name
没有赋值,所以还是为null(为空) - 然后构造器初始化(构造器不是创建对象,而是初始化对象),所以
age
和name
的值就被替换成构造器里面的值了,所以最后age
= 20,name
= 小倩 - 最后再将初始化好的这个类的内存地址赋值给
p
(p是对象名,也就是对象的引用)