Java 中神奇的 this 关键字

news/2025/1/23 6:07:08/

目录

一、为啥要有 this 关键字

二、this 关键字初露锋芒 —— 区分成员变量与局部变量

三、this 关键字的进阶玩法 —— 在方法链中穿梭

四、this 关键字与构造器的 “默契配合”

五、总结与叮嘱


 

家人们,今天我迫不及待要跟你们分享我在学习 Java 编程时遇到的一个超关键、超好用,但刚开始又有点让人摸不着头脑的东西 ——this 关键字。等你们了解清楚了,就会发现它就像一把万能钥匙,能帮咱们打开好多编程难题的锁,让代码写得更顺畅、更漂亮。

一、为啥要有 this 关键字

 

咱们先从生活里找个例子,想象一下你去超市购物,结账的时候,收银员得区分你买的东西和别人买的东西,对吧?在 Java 的类里,也有类似的情况。当一个类创建了多个对象时,每个对象都有自己的一套属性(就像每个人买的东西不一样),而有时候在对象的方法里,咱们需要明确指出是操作这个对象自身的属性,而不是其他对象的,这时候 this 关键字就登场了。

 

比如说,咱们创建一个 “汽车” 类,每辆汽车都有自己的品牌、颜色和速度这些属性,还有一个加速的方法。如果没有 this 关键字,当调用加速方法想要改变当前汽车的速度时,程序可能就分不清要改哪辆车的速度了,容易乱套。而 this 就像给每辆车都贴上了专属标签,让代码能精准定位到要操作的对象自身。

二、this 关键字初露锋芒 —— 区分成员变量与局部变量

 

在 Java 类的方法中,经常会出现成员变量和局部变量同名的情况。这时候 this 关键字就能大显身手,帮咱们清晰地区分它们。

 

看下面这个简单的 “人” 类的例子:

 

java">class Person {private String name;private int age;public Person(String name, int age) {// 这里的name和age是局部变量,接收传入的参数值// 通过this关键字,明确表示将传入的值赋给成员变量this.name = name;this.age = age;}public void introduce() {System.out.println("我叫" + this.name + ", 我今年" + this.age + "岁。");}
}

 

在构造器里,“this.name = name;” 和 “this.age = age;” 中的 “name” 和 “age” 左边的是成员变量(属于每个 “人” 对象特有的属性),右边的是局部变量(构造器接收的外部传入的参数)。要是没有 this,编译器就会犯迷糊,不知道你到底想给哪个 “name” 赋值。有了 this,就好比在混乱的人群中精准喊出了正确的名字,把值妥妥地赋给对应的成员变量。

 

咱们在主方法里创建并使用 “人” 类对象看看:

 

java">public class Main {public static void main(String[] args) {Person person1 = new Person("小明", 20);person1.introduce();Person person2 = new Person("小红", 18);person2.introduce();}
}

 

运行结果:
“我叫小明,我今年 20 岁。”
“我叫小红,我今年 18 岁。”

 

可以看到,通过 this 关键字,每个对象都能正确地初始化并展示自己的信息,互不干扰。

三、this 关键字的进阶玩法 —— 在方法链中穿梭

 

this 关键字还有个超酷的进阶用法,就是实现方法链。啥意思呢?就是让一个对象的多个方法可以像链条一样连续调用,让代码写起来更简洁、流畅。

 

咱们以一个 “订单” 类为例,订单有添加商品、设置数量、计算总价这些操作,通常我们可能会这样写代码:

 

java">class Order {private String item;private int quantity;private double price;public void addItem(String item) {this.item = item;}public void setQuantity(int quantity) {this.quantity = quantity;}public void calculatePrice(double price) {this.price = price;}public void printOrder() {System.out.println("订单详情:商品 - " + this.item + ", 数量 - " + this.quantity + ", 总价 - " + this.price);}
}

 

在主方法里使用:

 

java">public class Main {public static void main(String[] args) {Order order = new Order();order.addItem("手机");order.setQuantity(2);order.calculatePrice(5000.0);order.printOrder();}
}

 

现在,咱们利用 this 关键字来改造一下 “订单” 类,实现方法链:

 

java">class Order {private String item;private int quantity;private double price;public Order addItem(String item) {this.item = item;return this;}public Order setQuantity(int quantity) {this.quantity = quantity;return this;}public Order calculatePrice(double price) {this.price = price;return this;}public void printOrder() {System.out.println("订单详情:商品 - " + this.item + ", 数量 - " + this.qauntity + ", 总价 - " + this.price);}
}

 

注意看,每个设置属性的方法现在都返回 “this”,也就是当前对象本身。这样在主方法里,我们就可以像下面这样简洁地调用:

 

java">public class Main {public static void main(String[] args) {Order order = new Order().addItem("手机").setQuantity(2).calculatePrice(5000.0);order.printOrder();}
}

 

是不是感觉代码一下子变得清爽多了?就像把散落的珍珠用一根线串了起来,通过 this 关键字实现的方法链让对象的操作一气呵成。

四、this 关键字与构造器的 “默契配合”

 

前面咱们讲构造器的时候提到过,构造器是用来初始化对象的。而 this 关键字在构造器里也有独特的作用,特别是在构造器重载的时候。

 

假设我们有一个 “房子” 类,房子有面积、户型和价格这些属性,我们可能有多种构造房子对象的方式,比如只知道面积时创建一个简单的房子模型,或者知道面积、户型和价格时创建一个完整的房子模型。

 

java">class House {private double area;private String layout;private double price;public House(double area) {this.area = area;this.layout = "未知";this.price = 0.0;}public House(double area, String layout, double price) {// 这里使用this关键字调用另一个构造器,避免重复代码this(area);this.layout = layout;this.price = price;}public void printHouseInfo() {System.out.println("房子信息:面积 - " + this.area + ", 户型 - " + this.layout + ", 价格 - " + this.price);}
}

 

在第二个带三个参数的构造器里,“this (area);” 这句代码非常巧妙,它利用 this 关键字调用了第一个只带面积参数的构造器,先完成了部分初始化工作,然后再补充户型和价格的信息。这样既避免了重复代码,又保证了对象初始化的一致性。

 

在主方法里:

java">public class Main {public static void main(String[] args) {House house1 = new House(100.0);house1.printHouseInfo();House house2 = new House(120.0, "三室一厅", 1500000.0);house2.printHouseInfo();}
}

 

运行结果:
“房子信息:面积 - 100.0, 户型 - 未知,价格 - 0.0”
“房子信息:面积 - 120.0, 户型 - 三室一厅,价格 - 1500000.0”

 

可以看到,通过 this 关键字在构造器之间的灵活调用,我们能高效地创建不同需求的房子对象,让代码的复用性大大提高。

五、总结与叮嘱

 

家人们,今天关于 Java 的 this 关键字就跟你们唠到这儿啦。从区分变量、实现方法链,到助力构造器,this 关键字无处不在,发挥着关键作用。它就像一位贴心的向导,在对象的世界里为我们指引方向,确保代码准确无误地操作每一个对象。刚开始接触可能觉得有点绕,但多写几次代码,多琢磨琢磨,就能熟练掌握啦。要是之后我又学到啥好玩的编程知识,一定再回来跟大伙分享,祝家人们生活愉快,拜拜!

 


http://www.ppmy.cn/news/1565414.html

相关文章

【设计模式-行为型】职责链模式

一、什么是职责链模式 说到职责链模式,我头脑中想到的例子就是电影《人体蜈蚣》,不过有点血腥和恶心,所以想了想还是换一个例子形容比较好,在软件行业、建筑行业或工程项目,包工程或者包项目的项目承包大佬一个个都是责…

mysql数据库启动出现Plugin ‘FEEDBACK‘ is disabled.问题解决记录

本人出现该问题的环境是xampp,异常关机,再次在xampp控制面板启动mysql出现该问题。出现问题折腾数据库之前,先备份数据,将mysql目录下的data拷贝到其他地方,这很重要。 然后开始折腾。 查资料,会发现很多…

【分布式知识】Spring Cloud Gateway实现跨集群应用访问

SpringCloud Gateway实现跨集群应用访问 1. 设置服务注册中心配置 Eureka Server(示例)配置服务实例(示例) 2. 配置 Spring Cloud Gateway引入依赖配置 Gateway 3. 配置路由规则4. 服务实例配置(跨集群)5. …

网络爬虫技术如何影响网络安全的

随着网络的发展和网络爬虫技术的普及,一些人收集某些需要的信息,会使用网络爬虫进行数据抓取。网络爬虫一方面会消耗网络系统的网络资源,同时可能会造成核心数据被窃取,因此对企业来讲如何反爬虫显得非常重要。 一、什么是网络爬…

STM32-CAN总线

1.CAN总线简介 CAN总线是由BOSCH公司开发的一种简洁易用、传输速度快、易扩展、可靠性高的串行通信总线 2.CAN总线特征 两根通信线(CAN_H、CAN_L),线路少,无需共地差分信号通信(相对的是单端信号)&#…

重新理解tech lead角色

角色: tech leadleaderdeveloperarchitectleader:balance priorities,communicate clear goals,make apt decisions(做出适当的决定);supervise team members(管理团队成员),delegate tasks, issue feedback, evaluate risks, and resolve co…

深耕C/C++,解锁CV技术深度的钥匙

在21世纪的科技浪潮中,计算机视觉作为人工智能领域的一个重要分支,正以前所未有的速度推动着社会进步和产业升级。从智能手机的面部识别到自动驾驶汽车的路径规划,从医疗影像的精准分析到工业生产的自动化检测,计算机视觉算法的应…

AI新玩法:Flux.1图像生成结合内网穿透远程生图的解决方案

文章目录 前言1. 本地部署ComfyUI2. 下载 Flux.1 模型3. 下载CLIP模型4. 下载 VAE 模型5. 演示文生图6. 公网使用 Flux.1 大模型6.1 创建远程连接公网地址 7. 固定远程访问公网地址 前言 在这个AI技术日新月异的时代,图像生成模型已经成为了创意工作者和开发者手中…