当前位置: 首页 > news >正文

实用指南:【Java】P15 Java 深入理解 “this” 关键字

目录

  • 前言
  • 问题的起源:当形参“撞名”属性
  • 什么是 this?
  • this 的三种核心用法
    • 1. 调用成员变量
    • 2. 调用成员方法
    • 3. 调用构造器
  • 总结

在这里插入图片描述

前言

在 Java 编程中,我们经常会遇到一个神秘的关键字:this。对于初学者来说,它似乎无处不在,但又难以捉摸。它到底是什么?我们为什么需要它?又该在何时何地使用它呢?

本文将带你深入浅出地剖析 this 关键字,通过清晰的示例,让你彻底掌握它的三种核心用法。


问题的起源:当形参“撞名”属性

让我们从一个非常常见的场景开始。假设我们正在创建一个 Person 类,它有 nameage 两个属性。我们通常会为这些属性提供 set 方法,以便外部可以设置它们的值。

class Person {
String name;
int age;
// 为 age 属性设置值的方法
public void setAge(int a) {
age = a;
}
}

上面的代码工作得很好。但是,为了让参数名更具可读性,我们往往倾向于将参数名写得和属性名一样,比如这样:

class Person {
String name;
int age;
public void setAge(int age) {
// 疑似形参=形参
age = age;
}
}

现在问题来了:在 setAge 方法内部,我们希望两个都叫 age 的变量中,一个是类的属性(成员变量),另一个是方法的参数(局部变量)。当我们写 age = age; 时,Java 编译器会如何理解?

根据变量的“就近原则”,方法内的 age 会被优先解释为方法的参数。所以 age = age; 这行代码实际上变成了“把参数 age 的值赋给参数 age 自己”,这显然不是我们想要的!类的属性 age 从始至终都没有被赋值。

为了解决这种命名冲突,this 关键字闪亮登场。


什么是 this?

在 Java 中,this 是一个关键字,也是一个隐藏的引用。它指向当前对象

简单理解:

  • 当你在一个方法中调用 this 时,它就代表调用这个方法的那个对象
  • 当你在一个构造器中调用 this 时,它就代表正在被创建的那个对象

现在,让我们用 this 来解决刚才的问题:

class Person {
String name;
int age;
public void setAge(int age) {
// 使用 this.age 来明确指定这是类的属性
this.age = age;
// 等号右边的 age,因为没有 this 修饰,所以是方法的形参
}
}

通过 this.age,我们清晰地告诉编译器:“嘿,我要访问的是这个对象自己的 age 属性,而不是方法的参数。” 这样,赋值就变得准确无误了。


this 的三种核心用法

this 关键字主要用于以下三个方面:

  1. 调用成员变量
  2. 调用成员方法
  3. 调用构造器

1. 调用成员变量

这是 this 最常见的用法,就像我们上面看到的那样。

public void setName(String name) {
this.name = name; // 必须使用 this
}
  • 一般情况(可以选择省略): 当没有命名冲突时,this. 是可选的。编译器会自动帮你找到对象的属性。但是,为了代码的可读性,有些开发者也习惯性地加上 this
public void printAge() {
// 这两种写法效果完全一样
System.out.println("My age is: " + age);
System.out.println("My age is: " + this.age); // 加上 this 更清晰
}

2. 调用成员方法

与调用成员变量类似,你也可以使用 this 来调用当前对象的其他方法。

class Calculator {
public void add(int a, int b) {
System.out.println("Sum: " + (a + b));
}
public void calculateAndShow(int x, int y) {
System.out.println("Performing calculation...");
// 调用当前对象的 add 方法
this.add(x, y); // 这里的 this 同样可以省略
}
}

calculateAndShow 方法中,this.add(x, y)add(x, y) 是等价的。this 再次强调了“我正在调用我自己(这个对象)的另一个方法”。

3. 调用构造器

这是 this 一个非常强大且特殊的功能。当你的类有多个重载的构造器时,你可以在一个构造器中使用 this(形参) 来调用另一个构造器,从而避免代码重复。

让我们还是以 Person 类为例。假设我们希望提供三种创建 Person 对象的方式:

  1. 不提供任何信息。
  2. 只提供姓名。
  3. 提供姓名和年龄。
class Person {
String name;
int age;
// 1. 默认构造器
public Person() {
System.out.println("一个新的 Person 对象被创建了!");
}
// 2. 只提供姓名的构造器
public Person(String name) {
this(); // 调用上面的默认构造器
this.name = name;
}
// 3. 提供姓名和年龄的构造器
public Person(String name, int age) {
this(name); // 调用只提供姓名的构造器
this.age = age;
}
}

在上面的例子中:

  • Person(String name, int age) 构造器通过 this(name) 调用了 Person(String name) 构造器。
  • Person(String name) 构造器又通过 this() 调用了 Person() 默认构造器。

这样就形成了一个“构造器调用链”,极大地简化了代码,提高了复用性。

使用 this(...) 调用构造器时,必须遵守以下规则:

  1. 格式固定: 必须是 this(参数列表) 的形式。
  2. 必须在首行:this(...) 的调用语句必须是构造器内的第一行代码。
  3. 数量限制: 一个构造器中最多只能调用一个 this(...)。因为它必须在首行,所以不可能有两个。

总结

this 关键字是 Java 面向对象编程中的一个基础且重要的概念。它始终指向当前对象,为我们解决了变量命名冲突的问题,并提供了一种在构造器之间相互调用的优雅方式。

记住这几点:

  • 核心定义:this 代表当前对象实例。
  • 区分变量:局部变量成员变量同名时,this.变量 指的是成员变量
  • 调用方法:this.方法() 调用当前对象的其他方法,this 通常可省略。
  • 链式构造:this(参数) 在构造器中调用另一个重载的构造器,但必须放在第一行

希望通过这篇博文,你对 this 关键字有了更深刻的理解。在你的编码实践中,请大胆地使用它吧!


2025.10.13 西直门

http://www.jsqmd.com/news/35602/

相关文章:

  • 2025年服务贴心的离婚财产分割律师口碑指数榜
  • php项目出现提示 no input file specified的解决方法集锦
  • 2025年靠谱的白水苹果精品推荐厂家
  • 2025年诚信的建筑业体系认证管理体系认证专家推荐榜
  • 20251109-2
  • 深入解析:让AI说“人话“:TypeChat.NET如何用强类型驯服大语言模型的“野性“
  • 2025年评价高的专利评估综合口碑榜
  • 2025年口碑好的耐高温劳保鞋厂家推荐及选择指南
  • 基于高光谱成像和偏最小二乘法(PLS)的苹果糖度检测MATLAB实现
  • 2025年优质的青年鸡高评价榜
  • day07-一键生成儿歌视频工作流
  • 实用指南:手机群控软件在游戏运营中的风险管控技术实现
  • Zabbix服务告警: Zabbix server: Utilization of icmp pinger processes over 75%
  • Process Monitor 学习笔记(5.2):事件模型与五大类操作(文档/注册表/进程/网络/Profiling
  • flask: 用gunicorn部署flask项目
  • 2025年评价高的盐城短视频剪辑用户好评榜
  • 使用Math库执行数值计算
  • 实用指南:Guava Cache 高性能本地缓存库详解与使用案例
  • 深度学习进阶(一)——从 LeNet 到 Transformer:卷积的荣光与注意力的崛起 - 实践
  • 2025年热门的剧院舞台灯光厂家最新推荐榜
  • 2025年知名的火车宠物托运用户好评榜
  • 2025年专业的短视频运营本地优质榜
  • 2025年11月货架厂家推荐榜:五强对比评测与选购全解析
  • 2025年优秀的涂装喷砂房最新TOP排名厂家
  • 2025年靠谱的品牌展厅设计展示空间创新设计榜
  • 2025年优秀的海外短信平台用户推荐权威榜
  • 2025年11月geo优化服务商推荐榜:五强服务差异与风险中性提示
  • 2025年11月geo优化服务商实力推荐榜:头部案例与落地流程全公开
  • [ docker context ]
  • Zabbix服务告警:Zabbix server: Utilization of discoverer processes over 75%