Java 面向对象:this 关键字、构造方法与标准 JavaBean
Java 面向对象进阶语法涵盖 this 关键字用法与内存原理、构造方法的定义重载及初始化作用、标准 JavaBean 类的企业规范编写。通过代码示例与内存图解析,区分成员变量与局部变量,掌握无参与带参构造方法的区别,学习使用 IDE 快捷键生成符合规范的实体类,帮助开发者建立统一的编码习惯并理解对象创建机制。

Java 面向对象进阶语法涵盖 this 关键字用法与内存原理、构造方法的定义重载及初始化作用、标准 JavaBean 类的企业规范编写。通过代码示例与内存图解析,区分成员变量与局部变量,掌握无参与带参构造方法的区别,学习使用 IDE 快捷键生成符合规范的实体类,帮助开发者建立统一的编码习惯并理解对象创建机制。

在上一篇内容中,我们掌握了 Java 面向对象的基础:理解了面向对象的核心思想,学会了设计类、创建对象、使用对象,并掌握了封装的核心思想,通过 private 关键字私有化成员变量,提供 public 的 setXxx/getXxx 方法实现属性的安全赋值与取值,保证了数据的安全性。
但在上篇的封装代码中,我们发现了一个问题:setXxx 方法中出现了成员变量与局部变量同名的情况,此时该如何区分?创建对象时,能否在创建的同时直接给成员变量赋值,而非多次调用 set 方法?如何编写一套符合企业全规范的实体类?这就是本文要解决的核心问题,让我们的面向对象编码更规范、更高效。
在封装的 setXxx 方法中,我们会遇到成员变量(类中方法外)和局部变量(方法内/形参)同名的情况,而 Java 中默认遵循「局部变量优先」的原则,此时直接写变量名,程序会识别为局部变量,无法给成员变量赋值。
public class GirlFriend {
private String name; // 成员变量
// setName 方法:形参 name 是局部变量,与成员变量同名
public void setName(String name) {
name = name; // 局部变量给局部变量赋值,成员变量未被赋值!
}
}
此时调用 gf.setName("小浔浔"),成员变量 name 依然是默认值 null,这就是变量名冲突导致的问题,而 this 关键字就是解决这个问题的核心。
当成员变量和局部变量同名时,在成员变量名前加上 this.,即可明确表示引用的是「类中的成员变量」,从而区分同名的局部变量。
public class GirlFriend {
private String name; // 成员变量
public void setName(String name) {
this.name = name; // this.name → 成员变量;name → 局部变量(形参)
}
}
此时调用 gf.setName("小浔浔"),就能成功给成员变量 name 赋值,问题完美解决!
很多同学只记住了 this.的用法,却不懂其本质,这会影响后续的进阶学习,this 的本质是:当前方法调用者的对象内存地址值,是一个引用类型,指向当前对象本身。
简单来说:哪个对象调用了包含 this 的方法,this 就代表哪个对象,this 中存储的就是这个对象的堆内存地址。
以 Student 类的 setName 方法为例,结合内存分布,彻底讲清 this 的运行逻辑:
public class Student {
private String name;
public void setName(String name) {
this.name = name; // 核心行
}
}
public class StudentTest {
public static void main(String[] args) {
Student s1 = new Student();
s1.setName("付小玲"); // s1 调用 setName 方法
Student s2 = new Student();
s2.setName("桥小久"); // s2 调用 setName 方法
}
}
✅ 核心结论:this 是方法的隐藏参数,JVM 会在调用对象方法时自动传递,无需程序员手动定义,其值就是调用者对象的地址。
构造方法也叫构造器、构造函数,是 Java 类中一种特殊的方法,其唯一作用是:在创建对象时,由 JVM 自动调用,为对象的成员变量完成初始化(赋值),是对象创建过程中的关键步骤。
❌ 错误说法:构造方法是用来创建对象的。 ✅ 正确说法:new 关键字才是真正创建对象的核心,构造方法只是 new 创建对象时的其中一步,仅负责成员变量初始化,对象的创建还包括加载类、开辟堆空间、默认初始化等步骤。
构造方法是特殊的方法,有严格的格式要求,必须完全遵守,否则编译器会识别为普通方法:
public class 类名 {
// 构造方法
修饰符 类名 (参数列表) {
方法体; // 一般为成员变量赋值,完成初始化
}
}
构造方法分为无参构造方法和带参构造方法,两者配合使用,满足不同的初始化需求。
public class Student {
private String name;
private int age;
// 无参构造方法
public Student() {
// 可空,也可手动初始化
// this.name = "未知姓名";
// this.age = 0;
}
}
public class Student {
private String name;
private int age;
// 带参构造方法(参数与成员变量对应)
public Student(String name, int age) {
this.name = name; // 用 this 区分同名变量,给成员变量赋值
this.age = age;
}
}
构造方法由 JVM 在创建对象时自动调用,无需程序员手动调用,创建一次对象,就调用一次构造方法:
// 调用无参构造,创建对象并默认初始化
Student s1 = new Student();
// 调用带参构造,创建对象的同时赋值 name="阿强",age=23
Student s2 = new Student("阿强", 23);
这是笔试面试的高频考点,也是初学者的易混点,必须逐条牢记,零失分 ✔️
很多同学分不清构造方法和 setXxx 方法的使用场景,两者都能给成员变量赋值,核心区别在赋值时机和使用目的:
| 对比维度 | 构造方法 | setXxx 方法 |
|---|---|---|
| 赋值时机 | 创建对象时赋值,仅能赋值一次 | 创建对象后赋值,可多次赋值 |
| 核心目的 | 完成对象的初始化 | 完成对象属性的修改/重新赋值 |
| 调用方式 | JVM 自动调用,无需手动 | 程序员手动通过对象调用 |
| 参数 | 可无参/带参 | 必须带参(要赋值的内容) |
| 返回值 | 无返回值类型 | 无返回值(void) |
public class Student {
// 私有化成员变量
private String name;
private int age;
// 1. 手动编写无参构造方法(推荐)
public Student() {
System.out.println("无参构造方法被调用,对象创建中...");
}
// 2. 带参构造方法(重载),初始化所有成员变量
public Student(String name, int age) {
this.name = name; // this 区分同名变量
this.age = age;
System.out.println("带参构造方法被调用,对象初始化完成!");
}
// 3. get/set 方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
// 测试类
public class StudentTest {
public static void main(String[] args) {
// 调用无参构造创建对象
Student s1 = new Student();
// 创建对象后用 set 方法赋值
s1.setName("阿珍");
s1.setAge(24);
System.out.println(s1.getName() + " " + s1.getAge()); // 阿珍 24
// 调用带参构造创建对象,同时赋值
Student s2 = new Student("阿强", 23);
System.out.println(s2.getName() + " " + s2.getAge()); // 阿强 23
// 创建对象后用 set 方法修改值
s2.setAge(25);
System.out.println(s2.getName() + " " + s2.getAge()); // 阿强 25
}
}
✅ 运行结果:构造方法自动调用,赋值/修改逻辑正常,完全符合开发需求。
JavaBean 类是我们上篇讲的「描述一类事物的类」的企业级标准化版本,是 Java 项目中最基础、最常用的实体类(Entity 类),用于封装数据,所有的数据库表、接口返回数据、业务实体,都对应标准的 JavaBean 类。
标准 JavaBean 类是遵循 Java 官方制定的一套固定规范的类,所有程序员都按此规范编写,保证代码的统一性、可读性和可维护性。
这是 Java 开发的行业统一规范,无论是笔试还是企业开发,都必须严格遵守,缺一不可 ✨
/**
* 用户类 - 标准 JavaBean
* 包含:用户名、密码、邮箱、性别、年龄
*/
public class User {
// 1. 私有化所有成员变量
private String name;
private String pwd;
private String email;
private String gender;
private int age;
// 2. 无参构造方法
public User() {}
// 3. 带全部成员变量的带参构造方法
public User(String name, String pwd, String email, String gender, int age) {
this.name = name;
this.pwd = pwd;
this.email = email;
this.gender = gender;
this.age = age;
}
// 4. 为每个成员变量提供对应的 setXxx/getXxx 方法
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getPwd() { return pwd; }
public void setPwd(String pwd) { this.pwd = pwd; }
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
public String getGender() { return gender; }
public void setGender(String gender) { this.gender = gender; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
}
public class UserTest {
public static void main(String[] args) {
// 方式 1:无参构造 + set 方法
User u1 = new User();
u1.setName("张三");
u1.setPwd("123456");
u1.setEmail("[email protected]");
u1.setGender("男");
u1.setAge(20);
System.out.println(u1.getName() + " " + u1.getEmail()); // 张三 [email protected]
// 方式 2:带参构造直接初始化
User u2 = new User("李四", "654321", "[email protected]", "女", 22);
System.out.println(u2.getName() + " " + u2.getAge()); // 李四 22
}
}
实际开发中,手动编写 setXxx/getXxx 和构造方法非常繁琐,IDEA 提供了快捷键一键生成,大幅提升编码效率,这是开发必备技巧!
本文是 Java 面向对象的核心进阶内容,也是企业开发的基础规范内容。this 关键字、构造方法、标准 JavaBean 类,这三个知识点看似独立,实则紧密关联:this 解决了变量名冲突问题,构造方法实现了对象的高效初始化,标准 JavaBean 则将封装、this、构造方法整合,形成了企业开发的统一编码规范。
很多同学初学这些知识点时,会觉得'规则太多、记不住',这是正常的。Java 是一门强规范的语言,面向对象的规范更是如此,这些规则不是凭空制定的,而是为了解决实际开发中的问题、适配团队协作而总结的最佳实践。
学习的关键不是死记硬背规则,而是理解规则背后的原因,多动手练习:多写几个标准 JavaBean 类,用快捷键生成代码,体会 this 和构造方法的使用场景,慢慢的你就会发现,这些规范会成为你的编码习惯,写代码时会自然而然的遵循。
希望本文能帮你吃透面向对象的进阶语法,掌握企业级的编码规范。愿你在规范的编码中,夯实基础,稳步进阶!💪

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online