this关键字主要由以下三个方面的用途:
调用本类属性
调用本类方法
表示本类对象
1.this调用本类属性:只要在类中调用类的属性一定要加this关键字
看下面这段代码:
class Person{
private String name;
private int age;
public Person(String name,int age){
name = name; //this.name = name 加上this.可以赋值成功
age = age; //this.age = age 或者将右边名字换成与左边不同的
}
public void getPersoninfo(){
System.out.println("姓名为"+name+"年龄为"+age);
}
}
public class New1{
public static void main(String[] args) {
Person per1 = new Person("张三",18);
per1.getPersoninfo();
}
}
运行结果如下:
此时主方法的赋值并未生效,由于构造方法中的name = name,其中左边的name表示类中属性,右边的name是构造方法中的参数name,两者起名相同产生了歧义,赋值失败。
2. 调用本类方法
2.1 调用普通方法
class Person{
private String name;
private int age;
public void getPersoninfo(){
System.out.println("姓名为"+name+"年龄为"+age);
this.print();//this调用本类普通方法
}
public void print(){
System.out.println("****************");
}
}
public class New1{
public static void main(String[] args) {
Person per = new Person();
per.getPersoninfo();
}
}
调用本类普通方法不加this也行,但建议加上,加上this可以确定方法定义的来源。
2.2 调用构造方法
class Person{
private String name;
private int age;
public Person(){
System.out.println("***********");
}
public Person(String name){
System.out.println("***********");
this.name = name;
}
public Person(String name,int age){
System.out.println("***********");
this.name = name;
this.age = age;
}
public void getPersoninfo(){
System.out.println("姓名为"+name+"年龄为"+age);
}
}
public class New1{
public static void main(String[] args) {
Person per = new Person();
Person per1 = new Person("张三");
Person per2 = new Person("李四",20);
per.getPersoninfo();
per1.getPersoninfo();
per2.getPersoninfo();
}
}
上述代码出现大量重复代码,效率低下,使用this调用构造方法进行改进如下
class Person{
private String name;
private int age;
public Person(){
System.out.println("***********");
}
public Person(String name){
this(); //调用this无参构造
this.name = name;
}
public Person(String name,int age){
this(name); //调用this有参构造
this.age = age;
}
public void getPersoninfo(){
System.out.println("姓名为"+name+"年龄为"+age);
}
}
public class New1{
public static void main(String[] args) {
Person per = new Person();
Person per1 = new Person("张三");
Person per2 = new Person("李四",20);
per.getPersoninfo();
per1.getPersoninfo();
per2.getPersoninfo();
}
}
运行结果如下:
在用this调用构造方法时要注意:
a.调用构造方法必须放在构造方法首行
b.this调用构造方法不允许成环(eg:两个有参的调用一个有参的,一个 有参的调用无参的,无参的再调用两个有参的或一个有参的,此时会编译不通过,报错“递归构造器调用”)
3. this表示当前对象
class Person{
public void print(){
//this表示当前对象
System.out.println("[Person类的print方法]"+this);
}
}
public class New1{
public static void main(String[] args){
Person per1 = new Person();
System.out.println("[main方法的输出]"+per1);//此时per1中存放的是堆空间的地址
per1.print(); //print被Per1调用,上面print方法中的this就指的是per1
System.out.println("------------------分割线------------------");
Person per2 = new Person();
System.out.println("[main方法的输出]"+per2);
per2.print();
}
}