1. 类的成分:构造器
1.1 构造器的定义与作用
定义:
构造器是类中用于初始化对象的特殊方法,在通过 new 关键字创建对象时自动调用。
核心作用:
- 为对象的成员变量赋初始值。
- 执行对象创建时必要的初始化逻辑(如资源加载)。
语法格式:
public class 类名 {
// 构造器定义
public 类名(参数列表) {
// 初始化代码
}
}
示例:
public class Student {
String name;
int age;
// 无参构造器
public Student() {
System.out.println("无参构造器被调用");
}
// 有参构造器
public Student(String name, int age) {
this.name = name;
this.age = age;
System.out.println("有参构造器被调用");
}
}
1.2 构造器的特点
-
自动调用:
- 使用
new创建对象时,构造器会被自动执行。
Student s = new Student(); // 调用无参构造器 Student s2 = new Student("张三", 20); // 调用有参构造器 - 使用
-
命名规则:
- 构造器名称必须与类名完全一致,且没有返回值类型(包括
void)。
- 构造器名称必须与类名完全一致,且没有返回值类型(包括
-
支持重载:
- 一个类可以定义多个不同参数的构造器,实现多样化的初始化方式。
public class Car { String brand; double price; public Car() {} // 无参构造器 public Car(String brand) { this.brand = brand; } public Car(String brand, double price) { this.brand = brand; this.price = price; } }
1.3 构造器的应用场景
-
直接初始化属性:
通过有参构造器,在创建对象时直接为属性赋值,减少后续的setter调用。Student s = new Student("李四", 22); // 一步完成属性初始化 -
执行初始化逻辑:
例如加载配置文件、建立数据库连接等。public class Database { public Database() { loadConfig(); // 初始化时加载配置 connect(); // 建立数据库连接 } }
1.4 注意事项
-
默认无参构造器的失效:
- 若未定义任何构造器,Java 会默认提供一个无参构造器。
- 若定义了有参构造器,默认无参构造器将失效,需手动添加。
public class Student { public Student(String name) {} // 定义有参构造器后,默认无参构造器失效 public Student() {} // 必须显式定义无参构造器 } -
构造器调用链:
- 使用
this()调用同类中的其他构造器,减少代码冗余。
public class Book { String title; String author; public Book() { this("未命名", "未知作者"); // 调用有参构造器 } public Book(String title, String author) { this.title = title; this.author = author; } } - 使用
-
继承中的构造器:
- 子类构造器必须通过
super()调用父类构造器(默认调用父类无参构造器)。 - 若父类没有无参构造器,子类必须显式调用父类的有参构造器。
public class Animal { public Animal(String type) {} } public class Dog extends Animal { public Dog() { super("犬科"); // 必须显式调用父类有参构造器 } } - 子类构造器必须通过
1.5 内存与执行流程
对象创建过程:
- 在堆内存中分配对象空间。
- 根据构造器参数调用对应的构造器。
- 执行构造器内的代码(初始化属性或执行逻辑)。
- 返回对象引用给栈内存中的变量。
示例:
Student s = new Student("王五", 25);
内存分配示意图:
| 内存区域 | 存储内容 |
|----------|-----------------------------------|
| 堆内存 | Student对象:name="王五", age=25 |
| 栈内存 | 变量 s 存储堆内存地址(如0x4f3f5b24) |
1.6 总结
- 核心功能:构造器确保对象被正确初始化,避免未赋值属性引发的逻辑错误。
- 使用规范:
- 优先通过构造器完成对象属性的初始化。
- 显式定义无参构造器,避免因有参构造器的定义导致默认构造器失效。
- 进阶技巧:
- 利用
this()和super()优化构造器调用链。 - 结合业务需求,在构造器中执行必要的初始化逻辑。
- 利用
2. 类的成分:成员方法与 this 关键字
2.1 this 关键字的定义与作用
定义:
this是一个隐含的引用变量,表示当前对象。- 当对象调用方法时,
this指向该对象本身,可以通过this访问对象的成员变量和方法。 - 哪个对象调用这个方法,this就拿到哪个对象!!!!
核心作用:
- 区分成员变量与局部变量同名时的访问冲突。
- 在方法中调用当前对象的其他成员方法或构造器。
2.2 this 解决变量名冲突
场景:
当成员变量与方法的局部变量同名时,默认访问的是局部变量。使用 this 可以显式访问成员变量。
示例:
public class Student {
String name; // 成员变量
public void setName(String name) { // 局部变量 name
this.name = name; // 使用 this 访问成员变量
}
}
说明:
this.name表示当前对象的成员变量name。- 未使用
this时,name仅指向局部变量。
2.3 this 调用成员方法
场景:
在类的成员方法中,可以通过 this 调用其他成员方法(通常可省略 this)。
示例:
public class Calculator {
public void add(int a, int b) {
System.out.println("和:" + (a + b));
}
public void calculate() {
this.add(10, 20); // 显式调用成员方法(等价于直接写 add(10, 20))
}
}
2.4 this 调用构造器
场景:
在构造器中,通过 this(参数) 调用同类中的其他构造器(必须写在构造器的第一行)。
示例:
public class Book {
String title;
String author;
public Book() {
this("未命名", "未知作者"); // 调用有参构造器
}
public Book(String title, String author) {
this.title = title;
this.author = author;
}
}
2.5 注意事项
-
作用域限制:
this只能在非静态方法或构造器中使用,不能在静态方法中使用。
-
避免滥用:
- 当成员变量与局部变量无冲突时,可省略
this,提高代码简洁性。
- 当成员变量与局部变量无冲突时,可省略
-
链式调用:
- 通过返回
this实现方法的链式调用。
public class Student { String name; int age; public Student setName(String name) { this.name = name; return this; // 返回当前对象 } public Student setAge(int age) { this.age = age; return this; } } // 链式调用示例 Student s = new Student().setName("张三").setAge(20); - 通过返回
2.6 内存视角下的 this
对象调用过程:
- 当对象调用方法时,JVM 会隐式传递
this参数,指向堆内存中的对象实例。
示例:
Student s = new Student();
s.setName("李四");
内存分配:
| 内存区域 | 存储内容 |
|----------|-----------------------------------|
| 堆内存 | Student对象:name="李四" |
| 栈内存 | 变量 s 存储堆内存地址(如0x4f3f5b24) |
在 setName 方法中,this 指向堆内存中的对象实例。
2.7 总结
- 核心功能:
- 解决成员变量与局部变量同名时的访问冲突。
- 支持构造器和方法间的链式调用。
- 使用规范:
- 显式使用
this提高代码可读性,尤其在变量名冲突时。 - 合理利用
this()简化构造器代码。
- 显式使用
- 高级技巧:
- 结合链式调用设计流畅接口(Fluent API)。
2万+

被折叠的 条评论
为什么被折叠?



