Java基础详解:this关键字、对象比较与实体类关系设计

季宁
季宁
发布时间:2026-10-16 | 4人浏览过
原创

在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面向对象程序设计的相关资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表