[Java] Java类与对象中this关键字的作用与使用

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();
    }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43232778/article/details/87969438