还没弄明白Java中的this关键字吗,那来看这篇就够了

今天在上课时 , 冉冉大妹纸拉着我问:小哥哥 , 小哥哥 , 听说你在学Java , 那你知道this关键字吗?
我:啊?this啊? (完了完了 , 学习的时候学的什么也不是 , 这下被问到了 , 还是个妹纸 , 答不上来岂不尴尬) 。
冉冉妹纸:你到底知道嘛?不是吧 , 不是吧 , 听说你学了很久的Java , 不会连this关键字都不知道吧!
我:会啊 , 那还不简单 , 等我慢慢给你讲来(giao , 把握住机会 , 加分项啊这可是 , 必须说出点什么)
好了 , 来吧 , 给你讲讲this关键字
还没弄明白Java中的this关键字吗,那来看这篇就够了文章插图
this关键字的作用:1、区分成员变量和局部变量(当成员变量和局部变量重名时)
2、可在构造方法中调用同一个类的其他构造方法(但是规定this只能写在构造方法的第一行)
3、能调用构造方法 , 当然也能调用普通方法啦(在同一个类中的方法内部 , 其实不必要使用this来调用 , 直接写出方法名即可 , 但是有的人会认为 , 写出this会让代码看起来更规范 。 我认为这个完全没必要 。 这里看个人习惯吧 。 )~
我:你看 , 这不是很简单吗?
冉冉:什么啊 , 就这?我知道啊 , 你这不是在给我说点没用的话嘛 。
我:别气嘛 , 那我再给你扯点(绞尽脑汁的想)
4、this关键字还可以作为当前的对象的引用进行返回 , 我让你看看代码你就理解了
public class Student {public Student log2(){System.out.println("直接返回一个Student的引用");return this;}}就这么写 。 你看 , 多简单
冉冉:没听懂 , 返回什么对象什么引用啊 。。。
我:嗯 。。。。 好吧 , 那我再给你解释一下 。 再看一下代码!
public class TestMain {public static void main(String[] args) {Student student = new Student();Student student2 = student.log2();System.out.println(student == student2);}}
还没弄明白Java中的this关键字吗,那来看这篇就够了文章插图
你看 , 你 new 个对象(对象引用) , 然后去调用log2这个方法 , 就会再返回一个对象 , 此时这个对象和你new的那个是同一个 。 但是如果你直接return new Student(); 那此时这个对象就是一个新的对象 , 所以说 , this能返回当前对象(引用) 。 懂了吧!
冉冉:这样啊 , 那你这么说 , 我就知道了 。
我:再给你掰扯点 , 别着急;
你知道如果有两个Student的对象时 , 他们都要去调用同一个方法 , 怎么才能知道 , 到底是哪个对象在调用这个方法呢?比如这样的代码
public class Student {public void log2(int i) {System.out.println(i);}}public class TestMain {public static void main(String[] args) {Student s1 = new Student();Student s2 = new Student();s1.log2(2);s2.log2(3);}}是不是觉得这是两个不同对象的引用啊 , 当然能区分是谁在调用了啊!
其实本质不是这样滴
你在写完代码后 , 编译器悄悄在帮助你做了一个工作 , 为了让你省心呢 , 多么贴心啊 , 我要是....
冉冉:你倒是说啊 , 到底做了什么?
我:好吧;我说 。。。
当你在调用方法的时候 , 其实编译器悄悄在你传的参数前边加了当前的对象 , 像这样
s1.log2(s1,2);s2.log2(s2,3);当然 , 如果你这么写代码 , 那编译器肯定会说:这点小事情 , 还是我替你做吧 , 就不麻烦小主人了 , 然后无情的给了你一个红波浪线;
冉冉:真的假的啊 , 说的这么玄乎 。
我:害 , 你还不信 , 看下边的代码 , 我们在方法上做个小改动
public class Student {public void log2(int i) {System.out.println(this + " " + i);}}public class TestMain {public static void main(String[] args) {Student s1 = new Student();Student s2 = new Student();System.out.println("s1的地址----->" + s1);System.out.println("s2的地址----->" + s2);s1.log2(2);s2.log2(3);}}为了能看清楚是不是这样 , 我们吧 s1 s2 指向的地址在主方法中打印出来 , 发现和方法中的 this 打印出来的地址一样
还没弄明白Java中的this关键字吗,那来看这篇就够了文章插图
这就说明了 , 确实是将对象给传了进去 。
冉冉:啊 , 我懂了 , 我知道了 , 原来是这样啊 , 真神奇 。 我...我...
我:你怎么了 , 还有什么不懂得吗?
冉冉: 区分变量我总是记不住到底指向的是谁....
我:这个啊 , 简单 , 你记住就远原则 "this." 这个this打点调用的是谁 , 谁就是成员变量 。 如果你的变量出现了同名的情况 , 如果不进行指向 , 默认就是使用你的局部变量 。