一文秒杀Java中this关键字
- 2019 年 11 月 24 日
- 筆記

最近,我在草神极客时间的群,(业余草)大神都叫草神,作为号主,我觉得草哥还行。
草神丢出来了一段Java
代码,这个程序的结果是什么?为什么会这样?
package com.xttblog.demo; class SuperClass { void method() { System.out.println("SuperClass::method"); } void fun() { System.out.println("SuperClass::fun"); this.method(); } } class SubClass extends SuperClass { void method() { System.out.println("SubClass::method: Begin"); super.fun(); System.out.println("SubClass::method: End"); } } class Test { public static void main(String[] args) { SubClass a = new SubClass(); a.method(); } }
其实很容易知道,陷入了一个死循环。

在这里插入图片描述 运行的结果的顺序其实很简单,关键就是要理解this
到底指着谁,this表示对当前对象的引用,也就是subclass
对象

在这里插入图片描述
如果在new一个Superclass
对象,bug就解决了

在这里插入图片描述
但是你真正了解过this
吗
this原理:
- 代表的是当前对象。
- this就是所在函数的所属对象的引用。
简单说,哪个对象调用了this关键字所在的函数,this就代表哪个对象。
this有下面3中用法
引用成员变量
表示对当前对象的引用!
/** * @author: 毛利 */ public class Person1 { private int age; private String name; void Sayhello(Integer age ,String name){ //将局部变量的值传递给成员变量 this.name = name; this.age = age; System.out.println("我的名字是" + this.name + ",年龄是" + this.age); } public static void main(String[] args) { Person1 p = new Person1(); p.Sayhello(20,"maoli"); } }
这个应该人人都知道
表示用类的成员变量,而非函数参数
方法名来初始化对象,毛利到底 是19还是20呢?
/** * @author: 毛利 */ class Person { private int age = 19; public Person(){ System.out.println("初始化年龄:"+age); } public int GetAge(int age){ this.age = age; return this.age; } } public class test1 { public static void main(String[] args) { Person maoli = new Person(); System.out.println("maoli's age is "+maoli.GetAge(20)); } }
在Java中this这个关键字可以实现类属性的调用,类方法的调用,表示当前对象
初始化年龄:19 maoli's age is 20
毛利当然是20,奔2的人
这个例子和草神的bug一样的道理
形参与成员名字重名,用 this 来区分:
可以看到,这里 age 是 GetAge 成员方法的形参,this.age 是 Person 类的成员变量。
还有就是注意:this不能用在static方法中!
这跟jvm联系到一起
在静态函数是存在与类(class)一级,并不是对象(object)的一部分,所以也就没有this指针。因此,在静态方法中使用this是错误的。

在这里插入图片描述 当静态方法加载进内存进栈时,如果在静态方法中有this 和 super 关键字时,this和super也被加载到了内存,但是这个时候并没有对象的引用,this和super没有初始化,所有编译会报错。
this参数类型的构造器
如果为this提供了参数列表,那么即意味着对符合该参数列表的构造器的调用。 通过this关键字调用构造器有以下几条规范:
- 不能在普通方法中调用,只能在构造器中调用。
- 一个构造器中只能调用一次。
- 只能在构造器的第一行调用。
/** * @author: 毛利 */ public class test { public test(int a, int b, int c) { // 构造器的调用必须在一个构造器的第一行 this(a, b); //this(a); //此行报错,意味着在一个构造器里面只能调用一次构造器。 System.out.println(b); } public test(int a, int b) { this(a); System.out.println("a="+a); } public test(int a) { System.out.println("调用成功!"); System.out.println(a); } public static void main(String[] args) { new test(1, 2, 3); //调用成功,意味着虽然一个构造器中只能调用一次其它构造器,但却可以通过“一个调一个”的方式调用多个构造器。 } }
代码运行如下
调用成功! 1 a=1 2
其实this主要要三种用法:
1、表示对当前对象的引用!
2、表示用类的成员变量,而非函数参数,注意在函数参数和成员变量同名是进行区分
3、用于在构造方法中引用满足指定参数类型的构造器(其实也就是构造方法)。但是这里必须非常注意:只能引用一个构造方法且必须位于开始!
