简单谈谈this关键字
简单谈谈this关键字
this关键字代表的含义
它表示当前的对象,也正是如此,它不能出现在静态部分(static修饰的),因为那是类所有的,不存在对象。
举一个this关键字最常见的例子:
public class Test {
private int i;
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
}
setI(int i)中已经使用了参数i,成员变量也是i,如果想给成员变量赋值,就要借助this关键字了。其实可以把它看成是一个setI方法的参数,在调用方法的时候传进来。
this包含的对象的属性
大家可以来看下面的例子:
public class Test {
int i = 1;
int j = print();
int k = print();
int print() {
System.out.println(this);
return 2;
}
public static void main(String[] args) {
new Test();
}
}
程序在主函数中看到new关键字去创建对象,首先回去执行Test类的非静态成员的初始化工作,根据Java虚拟机的初始化执行顺序,可以知道当第一次执行print()方法时,成员变量i已经成功初始化并赋予正确的值,然而成员变量j还处于已声明未赋值的状态,我们在“System.out.println(this);”处打一个断点可以看到this的所有属性
this中包含了所有已声明的成员属性,并且可以看到此时程序的各个变量的值情况,j和k还处于默认值。当程序第二次执到这行代码,说明j也已经初始化成功,只剩下k未初始化完成。
当然如果程序中存在静态变量,this中是看不到的,因为它不属于对象的范畴,但是可以通过this.*的方式引用。
this调用构造方法
这也是this关键字常用的一种。当一个类中存在多个构造方法时,希望在一个构造方法中调用另一个构造方法,这时可以用this(…)的方式(注意这句话必须写在第一行)。
继承情况下的this
创建子类对象,父类中的this指代的对象其实还是子类对象,那它拥有什么属性呢?除了静态属性,其余的都有,修饰符无影响,修饰符只会影响属性是否可见。可以使用Java反射机制获取不可见的属性,例如
Field i = this.getClass().getSuperclass().getDeclaredField("i");
i.setAccessible(true);
int value = i.getInt(this);
this调用构造方法
还是本类中的其他构造方法。
this引用变量
如果父类和子类存在相同的成员变量或静态成员变量
引用static变量 | 引用成员变量 | |
---|---|---|
子类使用this | this.var子类、((Sup)this).var父类 | this.var执行子类的属性、((Sup)this).var执行父类的属性 |
父类使用this | this.var父类、((Child)this).var子类 | this.var执行父类的属性、((Child)this).var执行子类的属性 |
this引用方法
如果父类和子类存在相同的成员方法或静态成员方法
引用static方法 | 引用成员方法 | |
---|---|---|
子类使用this | this.function()执行子类的方法、((Sup)this).function()执行父类的方法 | 都执行子类的方法 |
父类使用this | this.function()执行父类的方法、((Child)this).function()执行子类的方法 | 都执行子类的方法 |
如有错误望指正,谢谢