简单谈谈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变量引用成员变量
子类使用thisthis.var子类、((Sup)this).var父类this.var执行子类的属性、((Sup)this).var执行父类的属性
父类使用thisthis.var父类、((Child)this).var子类this.var执行父类的属性、((Child)this).var执行子类的属性

this引用方法

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

引用static方法引用成员方法
子类使用thisthis.function()执行子类的方法、((Sup)this).function()执行父类的方法都执行子类的方法
父类使用thisthis.function()执行父类的方法、((Child)this).function()执行子类的方法都执行子类的方法

如有错误望指正,谢谢

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值