this的语义是代指之前提到的事物,表示这个。那这个又是哪个呢?在Java中this表示的当前对象。下面通过代码验证一下:
public class Demo {
public void testThis(){
System.out.println(this);
}
public static void main(String[] args) {
Demo demo = new Demo();
System.out.println(demo);
demo.testThis();
System.out.println("------------");
Demo demo1 = new Demo();
System.out.println(demo1);
demo1.testThis();
}
}
通过测试可以发现this指代的就是当前对象。观察一下以下代码:
public class Person {
private String name;
private int age;
public Person(String name,int age){
name = name;
age = age;
}
public void getInfo(){
System.out.println("name = " + name + ",age = " + age);
}
public static void main(String[] args) {
Person person = new Person("张三", 18);
person.getInfo();
}
}
它的输出会是什么呢?name = null,age = 0。name和age属性的值都是相应类型的值的默认值,也就是说name和age的值并没有传到对象去,主要原因就是参数和属性一致,分不清哪个是属性哪个是参数。那我们把参数改一下不就行了吗?确实是可以的,但是不建议,因为我们在阅读代码的时候需要知道每个属性、参数的含义,换一个参数名可能就无法正确的表明其含义。这时候就需要采用this关键字了。
public class Person {
private String name;
private int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
public void getInfo(){
System.out.println("name = " + name + ",age = " + age);
}
public static void main(String[] args) {
Person person = new Person("张三", 18);
person.getInfo();
}
}
通过this关键字消除了参数和属性之间的歧义。那没有使用this之前的name = name;到底哪个是属性哪个是方法参数呢?其实它们都是方法参数,这应该算是一种就近原则,你面前有一瓶水,十米外有一瓶水,没有确定一定要拿哪瓶水的情况下你肯定是拿面前的水。
this可以调用本类属性,当然也可以调用本类方法。
public class Person {
private String name;
private int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
public int getAge(){
return age;
}
public int tenYearsLater(){
return this.getAge() + 10;
}
public void getInfo(){
System.out.println("name = " + name + ",age = " + age);
}
public static void main(String[] args) {
Person person = new Person("张三", 18);
person.getInfo();
System.out.println(person.tenYearsLater());
}
}
this调用构造器。
public class Person {
private String name;
private int age;
public Person(){
System.out.println("无参构造");
}
public Person(String name){
this();
this.name = name;
}
public Person(String name,int age){
this(name);
this.age = age;
}
public void getInfo(){
System.out.println("name = " + name + ",age = " + age);
}
public static void main(String[] args) {
Person person = new Person("张三", 18);
person.getInfo();
}
}
如果类中有多个构造器的话,可以使用this关键字进行调用,语法是this(参数),但是不要出现互相调用(A调用B,B调用A),无参构造器尽量不要调用构造方法,this()要放在构造器第一行。为什么this()一定要放在第一行呢?原因很简单,你只有盖好了房子才能把东西放进去。如果this()不在第一行的话,你前面的东西怎么调用呢?又放在哪儿呢?所以说this调用构造器只能放在构造器首行。