大家好,我是小米,一个热爱分享技术的 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 会将当前对象传递给 Printer 的 print 方法,从而实现打印。
面试陷阱:this 的几个误区
1. 静态方法中能不能使用 this?
不能!因为静态方法是属于类的,而 this 是属于实例的。在静态方法中,this 根本不存在。
错误示例:
2. this 可以出现在匿名内部类中吗?
可以!但是要注意 this 的含义。
匿名内部类中,this 指的是匿名类实例,而不是外部类实例。如果需要引用外部类,可以用 外部类名.this 的方式。
示例代码:
总结
通过今天的学习,我们知道了 this 的四种常见用法:
- 区分成员变量和局部变量。
- 在构造方法中调用其他构造方法。
- 实现链式调用。
- 作为参数传递。
同时,我们也提醒自己:静态方法中不能使用 this,匿名内部类中要注意 this 的指向。
小练习:试试看!
最后,留个小作业给大家:实现一个 Student 类,包含 name 和 score 两个属性,支持以下操作:
- 使用构造方法初始化对象。
- 通过链式调用设置 name 和 score。
- 打印对象信息。
欢迎在评论区留言你的答案,我会第一时间帮你点评!
END
记住,写代码不在于记住多少,而在于动手实践!加油,我们下期见!
我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!