Java基础却常被忽略:全面讲解this的实战技巧!

简介: 小米,29岁程序员,分享Java中`this`关键字的用法。`this`代表当前对象引用,用于区分成员变量与局部变量、构造方法间调用、支持链式调用及作为参数传递。文章还探讨了`this`在静态方法和匿名内部类中的使用误区,并提供了练习题。



大家好,我是小米,一个热爱分享技术的 29 岁程序员。最近,一位朋友跟我诉苦,说他参加了一场 Java 社招面试,面试官问了一个看似简单却让人抓狂的问题——“请讲讲 this 关键字的用法。”

“这不是基础到不能再基础的问题吗?居然问这个!”朋友心里这么想,但冷静下来才发现,虽然每天用 this,但真要系统解释却有点卡壳。于是,我决定整理一篇文章,帮大家理清楚 this 的各种妙用,顺便解答几个常见的面试陷阱。

this 是什么?

this 是 Java 中的一个关键字,简单说,它代表当前对象的引用。当我们在类中调用它时,this 指向当前类的实例。它的主要作用包括:

  • 区分类的成员变量和局部变量。
  • 在构造方法中调用其他构造方法。
  • 返回当前对象(链式调用)。
  • 作为参数传递。

来看几个场景化的例子,理解它的用法。

区分成员变量和局部变量

先来看一个场景,小明是个初级开发,刚写完以下代码:

小明很疑惑,为什么他调用 setName("小米") 后,getName() 返回的还是 null?其实问题出在 name = name; 这行代码。

这里的两个 name 指的是同一个局部变量!如果想赋值给类的成员变量,必须用 this 来指明。

正确代码如下:

这就是 this 的最基础用法之一:区分同名变量。

在构造方法中调用其他构造方法

接下来,假设你要写一个 Person 类,有多个构造方法。面试官可能会问:“如何避免构造方法中代码重复?”

用 this 来调用另一个构造方法就是最佳答案!

来看代码:

上面的代码中,this(name, 0) 调用了第二个构造方法。这样既减少了重复代码,又方便统一管理逻辑。

注意:

  • 构造方法中调用其他构造方法时,this 必须是方法的第一行。
  • 不允许循环调用构造方法,否则会编译错误。

支持链式调用

面试中,很多人会提到链式调用。比如我们希望下面的代码可以运行:

实现链式调用的关键就在于方法返回 this。代码如下:

通过返回 this,我们可以在一个语句中完成多个调用,大大提升代码的可读性和优雅度。

作为参数传递

有时候,我们希望把当前对象传递给另一个方法或对象,这时候 this 就派上用场了!

比如,有一个 Printer 类,负责打印对象的信息。我们可以这样实现:

调用 person.print() 时,this 会将当前对象传递给 Printerprint 方法,从而实现打印。

面试陷阱:this 的几个误区

1. 静态方法中能不能使用 this?

不能!因为静态方法是属于类的,而 this 是属于实例的。在静态方法中,this 根本不存在。

错误示例:

2. this 可以出现在匿名内部类中吗?

可以!但是要注意 this 的含义。

匿名内部类中,this 指的是匿名类实例,而不是外部类实例。如果需要引用外部类,可以用 外部类名.this 的方式。

示例代码:

总结

通过今天的学习,我们知道了 this 的四种常见用法:

  • 区分成员变量和局部变量。
  • 在构造方法中调用其他构造方法。
  • 实现链式调用。
  • 作为参数传递。

同时,我们也提醒自己:静态方法中不能使用 this,匿名内部类中要注意 this 的指向。

小练习:试试看!

最后,留个小作业给大家:实现一个 Student 类,包含 name 和 score 两个属性,支持以下操作:

  • 使用构造方法初始化对象。
  • 通过链式调用设置 name 和 score。
  • 打印对象信息。

欢迎在评论区留言你的答案,我会第一时间帮你点评!

END

记住,写代码不在于记住多少,而在于动手实践!加油,我们下期见!

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号软件求生,获取更多技术干货!

相关文章
|
3月前
|
存储 Java 开发者
Java Map实战:用HashMap和TreeMap轻松解决复杂数据结构问题!
【10月更文挑战第17天】本文深入探讨了Java中HashMap和TreeMap两种Map类型的特性和应用场景。HashMap基于哈希表实现,支持高效的数据操作且允许键值为null;TreeMap基于红黑树实现,支持自然排序或自定义排序,确保元素有序。文章通过具体示例展示了两者的实战应用,帮助开发者根据实际需求选择合适的数据结构,提高开发效率。
88 2
|
17天前
|
Java
Java基础却常被忽略:全面讲解this的实战技巧!
本次分享来自于一道Java基础的面试试题,对this的各种妙用进行了深度讲解,并分析了一些关于this的常见面试陷阱,主要包括以下几方面内容: 1.什么是this 2.this的场景化使用案例 3.关于this的误区 4.总结与练习
|
2月前
|
安全 Java 开发者
Java 多线程并发控制:深入理解与实战应用
《Java多线程并发控制:深入理解与实战应用》一书详细解析了Java多线程编程的核心概念、并发控制技术及其实战技巧,适合Java开发者深入学习和实践参考。
70 6
|
2月前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
|
3月前
|
存储 消息中间件 安全
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
【10月更文挑战第9天】本文介绍了如何利用JUC组件实现Java服务与硬件通过MQTT的同步通信(RRPC)。通过模拟MQTT通信流程,使用`LinkedBlockingQueue`作为消息队列,详细讲解了消息发送、接收及响应的同步处理机制,包括任务超时处理和内存泄漏的预防措施。文中还提供了具体的类设计和方法实现,帮助理解同步通信的内部工作原理。
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
|
3月前
|
开发框架 Java 程序员
揭开Java反射的神秘面纱:从原理到实战应用!
本文介绍了Java反射的基本概念、原理及应用场景。反射允许程序在运行时动态获取类的信息并操作其属性和方法,广泛应用于开发框架、动态代理和自定义注解等领域。通过反射,可以实现更灵活的代码设计,但也需注意其性能开销。
65 1
|
4月前
|
缓存 负载均衡 Dubbo
Dubbo技术深度解析及其在Java中的实战应用
Dubbo是一款由阿里巴巴开源的高性能、轻量级的Java分布式服务框架,它致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
101 6
|
4月前
|
Java
领略Lock接口的风采,通过实战演练,让你迅速掌握这门高深武艺,成为Java多线程领域的武林盟主
领略Lock接口的风采,通过实战演练,让你迅速掌握这门高深武艺,成为Java多线程领域的武林盟主
44 7
|
4月前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
在Android应用开发中,追求卓越性能是不变的主题。本文介绍如何利用Android NDK(Native Development Kit)结合Java与C++进行混合编程,提升应用性能。从环境搭建到JNI接口设计,再到实战示例,全面展示NDK的优势与应用技巧,助你打造高性能应用。通过具体案例,如计算斐波那契数列,详细讲解Java与C++的协作流程,帮助开发者掌握NDK开发精髓,实现高效计算与硬件交互。
174 1
|
4月前
|
存储 负载均衡 Java
Jetty技术深度解析及其在Java中的实战应用
【9月更文挑战第3天】Jetty,作为一款开源的、轻量级、高性能的Java Web服务器和Servlet容器,自1995年问世以来,凭借其卓越的性能、灵活的配置和丰富的扩展功能,在Java Web应用开发中占据了举足轻重的地位。本文将详细介绍Jetty的背景、核心功能点以及在Java中的实战应用,帮助开发者更好地理解和利用Jetty构建高效、可靠的Web服务。
337 2