上一篇文章讲构造器时提到过this关键字,在这里具体的介绍这个概念。
什么是this
什么是this?Java虚拟机会给每个对象分配this,代表当前对象,简单来说this就是对象的应用。
下面先了解怎么用,然后再看它的本质。
this的用法
- 访问类的属性,区分成员变量和局部变量
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,然后选成员变量。
- 访问成员方法
语法:
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();
}
}
- 访问构造器方法
语法:
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。