1. this 表示本类属性
打破程序的就近取用原则,直接去类的属性中找同名属性。
语法:this.属性名称
class Person {
private String name;
private int age;
public Person(**String n, int a**) {
name = **n**;
age = **a**;
}
public void getPersonInfo() {
System.out.println("姓名是:"+name+", 年龄是:"+age);
}
}
public class ThisBiaoShiBenLeiShuXing {
public static void main(String[] args) {
Person per = new Person("张三", 18);
per.getPersonInfo();
}
}
结论:类的构造方法中的参数要是用了不同于类的属性的名称时,类中属性可以被正确赋值。
class Person {
private String name;
private int age;
public Person(String name, int age) {
name = name;
age = age;
}
public void getPersonInfo() {
System.out.println("姓名是:"+name+", 年龄是:"+age);
}
}
public class ThisBiaoShiBenLeiShuXing {
public static void main(String[] args) {
Person per = new Person("张三", 18);
per.getPersonInfo();
}
}
结论:当构造方法中的参数与类中属性同名时,类中属性无法被正确赋值。
- 解决方法:此时我们加上 this 关键字便可以正确给对象属性赋值:
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void getPersonInfo() {
System.out.println("姓名是:"+name+", 年龄是:"+age);
}
}
public class ThisBiaoShiBenLeiShuXing {
public static void main(String[] args) {
Person per = new Person("张三", 18);
per.getPersonInfo();
}
}
建议:只要在类中方法访问类中属性,一定要加this关键字!!!
2. this表示本类方法
① this表示本类构造方法
在构造方法首行使用this(参数)表示调用本类的构造方法。
语法:this(方法参数);
class Person {
private String name;
private int age;
public Person() {
System.out.println("产生一个新的Person对象");
}
public Person(String name) {
System.out.println("产生一个新的Person对象");
this.name = name;
}
public Person(String name, int age) {
System.out.println("产生一个新的Person对象");
this.name = name;
this.age = age;
}
public void getPersonInfo() {
System.out.println("姓名是:"+name+", 年龄是:"+age);
}
}
public class ThisBiaoShiBenLeiFangFa {
public static void main(String[] args) {
Person per1 = new Person();
Person per2 = new Person("张三");
Person per3 = new Person("李四", 20);
per1.getPersonInfo();
per2.getPersonInfo();
per3.getPersonInfo();
}
}
我们可以发现虽然类中属性可以被正确赋值但是构造方法的重载部分出现了大量的重复代码,使得代码的质量很差。
- 解决方法:在Java中,支持构造方法的互相调用(this):
class Person {
private String name;
private int age;
public Person() {
System.out.println("产生一个新的Person对象");
}
public Person(String name) {
// 调用本类无参构造
this();
this.name = name;
}
public Person(String name, int age) {
// 调用本类有参构造
this(name);
this.age = age;
}
public void getPersonInfo() {
System.out.println("姓名是:"+name+", 年龄是:"+age);
}
}
public class ThisBiaoShiBenLeiFangFa {
public static void main(String[] args) {
Person per1 = new Person();
Person per2 = new Person("张三");
Person per3 = new Person("李四", 20);
per1.getPersonInfo();
per2.getPersonInfo();
per3.getPersonInfo();
}
}
注意:this调用本类构造方法必须写在构造方法首行;this调用构造方法不能成“环”。
② this表示本类普通方法
语法:this.方法名称(方法参数);
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.fun();
this.name = name;
this.age = age;
}
public void getPersonInfo() {
System.out.println("姓名是:"+name+", 年龄是:"+age);
}
public void fun() {
System.out.println("产生一个Person对象");
}
}
public class ThisBiaoShiBenLeiFangFa {
public static void main(String[] args) {
Person per = new Person("张三", 20);
per.getPersonInfo();
}
}
虽然调用本类普通方法不需要加this也可以正常调用,但强烈建议加上,加上this的目的可以区分方法的定义来源(尤其是在有继承的情况下,使用this可以明确的表示调用的是本类方法)。
3. this表示当前对象
当前调用的属性或方法是通过哪个对象调用的,this就指代它。
class Person {
public void print() {
System.out.println("print方法"+this);
}
}
public class ThisBiaoShiDangQianDuiXiang {
public static void main(String[] args) {
Person per1 = new Person();
System.out.println("main方法"+per1);
per1.print();
System.out.println("==========");
Person per2 = new Person();
System.out.println("main方法"+per2);
per2.print();
}
}