Java自学之路——this关键字

上一篇文章讲构造器时提到过this关键字,在这里具体的介绍这个概念。

什么是this

什么是this?Java虚拟机会给每个对象分配this,代表当前对象,简单来说this就是对象的应用。
下面先了解怎么用,然后再看它的本质。

this的用法

  1. 访问类的属性,区分成员变量和局部变量
this.属性名

用this关键字我们可以明确的区分成员变量和局部变量。比如在写构造器的时候,我们可以把构造器的参数名和类的成员变量名写成一样,但必须在类的成员变量前加this关键字,这样可以区分构造器的局部变量和类的成员变量。

public class This {
    public static void main(String[] args) {
        Person p1=new Person("jack",19);
        System.out.println("p1的信息如下");
        System.out.println("姓名:"+p1.name);
        System.out.println("年龄:"+p1.age);
        Person p2=new Person("nicol",23);
        System.out.println("p2的信息如下");
        System.out.println("姓名:"+p2.name);
        System.out.println("年龄:"+p2.age);
    }
}
class Person{
    String name;
    int age;
    public Person(String name,int age) {
        this.name=name;
        this.age=age;
    }
}

运行代码看一下
在这里插入图片描述
在这里this的作用就是指定那个是成员变量,明确的跟局部变量区分开。一般写构造器经常用到this关键字,IDEA有一个快捷方式,按Alt+Insert,点Constructor,然后选成员变量。

  1. 访问成员方法
    语法:
this.方法名(参数列表);
public class This1 {
    public static void main(String[] args) {
        Function f=new Function();
        f.f2();

    }
}
class Function{
    public void f1(){
        System.out.println("我是f1()方法.......");
    }

    public void f2(){
        System.out.println("我是f2()方法.......");
        System.out.println("我准备调用f1()方法");
        this.f1();
    }
}
  1. 访问构造器方法
    语法:
this(参数列表);

这里注意的是,这种用法只能在构造器中使用,也就是说在构造器中访问另一个构造器,而且必须放在第一条语句。下面看实例:

public class text {
    public static void main(String[] args) {
        person p=new person();
        p.Info();
    }
}
class person{
    String name;
    int age;

    public person() {
        this("jack",25);
        System.out.println("我是无参构造器");
    }

    public person(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("我是有参构造器");
    }

    public void Info(){
        System.out.println("name:"+this.name+"   age:"+this.age);
    }
}

这里在无参构造器里用this调用有参构造器,根据参数列表,会找到对应的构造器。
别忘了,必须放在第一条语句。

this的本质

上面了解了怎么用,接下来看一下它的本质。
在说什么是this的时候提到,java虚拟机会给每个对象分配this,下面来验证一下这件事:

public class This {
    public static void main(String[] args) {
        //创建对象p1
        Person p1=new Person("jack",19);
        
        System.out.println("p1的信息如下");
        System.out.println("姓名:"+p1.name);
        System.out.println("年龄:"+p1.age);
        //输出p1对象的地址
        System.out.println("对象p1的hashcode:"+p1.hashCode());
        //创建对象p2
        Person p2=new Person("nicol",23);
        System.out.println("p2的信息如下");
        System.out.println("姓名:"+p2.name);
        System.out.println("年龄:"+p2.age);
        //输出p2对象的地址
        System.out.println("对象p2的hashCode:"+p2.hashCode());

    }
}
class Person{
    String name;
    int age;
    
    public Person(String name,int age) {
        this.name=name;
        this.age=age;
        输出this的地址
        System.out.println("this的hashCode:"+this.hashCode());
    }
}

运行结果:
在这里插入图片描述
Java是在虚拟机上跑的,地址是虚拟机的地址,对象的地址是无法直接获取到的,所以在这里用hashCode来完成验证的。
hashCode,你可以简单的把它当作对象地址,但它不是真正的对象地址。它返回的是对象的哈希码值,它确实会针对不同的对象返回不同的整数,这一般是将该对象的内部地址转换成一个整数来实现的。

在上面的运行结果里可以看到,this的地址和对象的地址是一样的,this会指向对应的对象本身,下面的内存结构图我画的不是很好,但标的很清楚,内存图可以结合代码去深入的了解this。
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值