Java基础详解:this关键字、对象比较与实体类关系设计
在Java开发中,this 是面向对象编程的核心关键字之一。它不仅用于解决构造器参数与成员变量重名的问题,还能实现构造方法的链式调用及获取当前对象引用。本文将系统讲解 this 的关键用法、对象的内存比较逻辑,并通过员工/部门(一对多)和学生/课程(多对多)的实例,演示如何在实际项目中构建清晰的实体类引用关系。
this关键字的三大核心用法
this 关键字在Java中有三个主要作用:标识本类属性、调用本类其他方法及表示当前对象。掌握这些用法对于编写规范、易读的Java代码至关重要。
第1步:使用“this.属性”区分类成员与局部变量
目的:当构造方法或普通方法的参数名称与类的私有属性(Private Field)同名时,编译器会遵循“就近原则”,导致无法直接赋值。
操作:在属性前增加 this 前缀以明确指向当前对象的成员变量。
以下为修正后的代码示例:
class Person{
private String name;
private int age;
// 参数名与属性名相同,必须使用 this.
public Person(String name,int age){
this.name = name; // this.name 指向类属性,等号右侧 name 为参数
this.age = age;
}
public String getInfo(){
return "姓名:"+name+","+"年龄:"+age;
}
}
完成状态:成功初始化了 Person 对象的 name 和 age。
第2步:使用“this()”进行构造方法间的互相调用
目的:消除多个重载构造函数之间的重复代码(如打印相同的欢迎信息),符合 DRY(Don't Repeat Yourself)原则。
注意:this() 调用必须放在构造方法的首行;同时需确保至少有一个构造方法不依赖 this() 作为递归出口。
class Person{
private String name;
private int age;
public Person(){
System.out.println("-----欢迎光临-----"); // 无参构造作为出口
}
public Person(String name){
this(); // 调用上一行的无参构造
this.name = name;
}
public Person(String name,int age){
this(name); // 调用单参数构造
this.age = age;
}
}
第3步:使用“this”表示当前对象
目的:获取当前正在执行方法的对象本身的内存地址或引用。
入口:普通方法内部。
运行以下测试代码可直观观察对象引用的不同:

每个 Dx 对象拥有独立的内存空间,this 分别指向它们自身。
对象比较与引用传递机制
引用传递分析:自定义类 vs String
Java中的参数传递始终是“值传递”,但对于对象而言,传递的是“对象引用的值”(即内存地址)。
程序一(类对象传递):修改传入的对象属性会影响原对象,因为它们指向同一块内存。
public static void fun(Message temp){ //引用传递
temp.setNum("30"); // 影响原对象 message 的数据
}
程序二(String 字符串传递):字符串是不可变的。方法内的 temp = "world" 只是让局部变量 temp 指向了新字符串的地址,并未改变外部原变量的地址指向。

对象比较实战
对象比较分为两种场景:比较内存地址(是否同一个对象)和比较内容(是否数据相等)。
规则:
- 使用
==比较两个引用是否指向同一内存地址(通常返回 false)。 - 比较内容应重写
equals()方法,或手动比对各个属性字段。
if(per1.getName().equals(per2.getName()) && per1.getAge() == per2.getAge()){
// 逻辑上判断为“是同一个对象”的特征
}

实战:基于表关系的Java实体类建模
通过模拟数据库表结构,在 Java 中建立对象间的一对多和多对多关联关系。
第一步:设计一对多关系(emp & dept)
场景需求:一个部门有多个员工(dept -> emps[]),一个员工属于一个部门(emp -> dept),且存在上下级领导关系(emp -> mgr)。
代码架构:
Dept类包含数组属性Emp[] emps。Emp类包含引用属性Dept dept和Emp mgr。
// Dept 类中定义存储该部门所有员工的列表
private Emp [] emps;
public void setEmps(Emp [] emps){ this.emps = emps; }
第二步:设计多对多关系(student & course)
场景需求:学生选多门课,一门课有多人选。需要中间关联类 StudentCourse 来保存成绩。
Student持有StudentCourse[]。Course持有StudentCourse[]。StudentCourse聚合了学生对象、课程对象以及分数。
class StudentCourse{
private Student student;
private Course course;
private double score; // 关联表中额外的成绩字段
}
// 查询某课程的所有学生
for(StudentCourse sc : course.getStudentCourses()) {
System.out.println(sc.getScore());
}
以上就是这一阶段关于Java基础重点知识的详细内容,更多关于Java面向对象程序设计的相关资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









