全面认识this及其使用方法
储备知识
我们都知道,Java中的方法与C语言中的函数类似,由返回值,方法名,参数,方法体,不同的是Java的方法是包含在类中的,并且还多了一个访问限制修饰符,不过这和this的使用关系不大,我们暂时不关心。我们需要了解的是,在Java调用方法时,传参不仅仅是你自己写入的参数,还传入了当前对象的信息,在方法中由this接收,文字描述过于抽象,接下来我会用实例来演示。
class Person {
private String name;
private int age;
public void set(String name1,int age1) {
name = name1;
age = age1;
}
public void show() {
System.out.println(name);
System.out.println(age);
}
}
public class Test {
public static void main(String[] args) {
Person person1 = new Person();
person1.set("dpy",20);
person1.show();
Person person2 = new Person();
person2.set("dps",19);
person2.show();
Person person3 = new Person();
person3.set("dph",18);
person3.show();
}
}
这上面的例子实际上就是创建了一个类,用来描述人,成员变量为name和age,还有两个成员方法分别用于成员变量的赋值与输出。到这里大家可能有所疑问,this在哪里被使用了呢?接下来我们重点关注一下主方法main中new了三个对象person1,person2,person3,在用对象调用Person类中的方法set时传入了两个参数,重点来了,在上面我们提到了在Java中会将对象的信息传给方法,让系统知道这是当前对象是person1,person2还是person3。而在方法中用this来接收。也就是说类中的方法还有一个隐藏的参数,实际上系统来看是这样的,如下:
public void set(**Person this**,String name1,int age1) {
name = name1;
age = age1;
}
this的类型就是所在类的名字,this就相当于当前对象,假如现在的对象是person1,代码应该是:
public void set(**Person this**,String name1,int age1) {
person1.name = name1;
person1.age = age1;
}
我们需要让明确我们现在赋值的是具体是哪个对象,所以在写代码的时候需要写清楚是哪个对象,因为this接受了对象person1,所以在实际写代码的时候不需要像上面那样写,将person1改为this即可,如下:
public void set(**Person this**,String name1,int age1) {
this.name = name1;
this.age = age1;
}
好了,现在我们明白了this是做什么的了,但是有人可能会问,可是我之前写代码的时候没有加this并没有报错呀,程序还是正常运行的,这是为什么呢,下面我会做出解释。正常来说,在一些情况下不用this的确是不会出错,但是在一些特殊情况下不行,例如:
class Person {
private String name;
private int age;
public void set(String **name**,int **age**) {
name = name;
age = age;
}
public void show() {
System.out.println(name);
System.out.println(age);
}
}
public class Test {
public static void main(String[] args) {
Person person1 = new Person();
person1.set("dpy",20);
person1.show();
}
}
注意看此时set方法下的参数,与成员变量相同,这时候程序就无法如预期那样运行了,由于局部变量优先的缘故,参数与成员变量同名,在方法体中,参数优先,所以相当于自己给自己赋值,而成员变量并没由修改,还是默认初始值0。在这时候我们就需要加上this,像:
class Person {
private String name;
private int age;
public void set(String **name**,int **age**) {
this.name = name;
this.age = age;
}
public void show() {
System.out.println(name);
System.out.println(age);
}
}
public class Test {
public static void main(String[] args) {
Person person1 = new Person();
person1.set("dpy",20);
person1.show();
}
}
这样程序即可正常运行了,所以在我们平时写代码的时候最好习惯性的加上this,以免遇上以上的情况。
this的三种用法
this引用当前对象
这个用法就是我们上面所讲的给当前对象赋值,这里我们就不再过多的赘述。
this访问构造方法
何为构造方法
在学习这种用法之前,我们需要了解什么是构造方法。先来看构造方法的定义,构造方法非常特殊,这个方法没有返回值,方法名和类名是一致的。如果你在创建的类中没有写任何的构造方法,此时Java会默认提供一个构造函数,这个构造函数是不带参数的。如果自己写了,就会调用自己的,且只会调用一次,不管你写的构造方法是怎么样的,Java都不再默认提供构造函数。例如Person这个类的默认构造函数为:
public Person() {
}
自己写的构造函数就是不同只是参数不同罢了,构造函数是在new一个新对象时会自动运行的。(这里简略介绍了构造函数,不明白的可以看看我的另一篇博客或者自行学习)
ok,明白了什么是构造函数,我们就可以学习如何用this访问构造方法了。
public Person() {
this("dpy",20)
}
public Person(string a,int b) {
}
如上,当你在类中写了两个及两个以上构造函数的时候,上面的构造函数可以通过this访问到下面的构造函数,需要注意的是参数对应,反之,下面的构造函数也可以通过this访问上面的构造函数。(这里还涉及了方法的重载的知识,不明白的可以看看我的另一篇博客或者自行学习)
this访问成员方法
与访问构造函数相似,既一个成员方法体中可以用this访问另一个成员方法,如下:
public void set(String **name**,int **age**) {
this.name = name;
this.age = age;
this.show();
}
public void show() {
System.out.println(name);
System.out.println(age);
}
至此,我们就了解清楚了何为this,如何使用this。