简单谈谈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引用变量

如果父类和子类存在相同的成员变量或静态成员变量

扫描二维码关注公众号,回复: 6197536 查看本文章
引用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()执行子类的方法 都执行子类的方法

如有错误望指正,谢谢

猜你喜欢

转载自blog.csdn.net/qq_36744284/article/details/89366605