Java中this关键字

119 阅读3分钟

this关键字的使用

1. 目前可能出现的问题?及解决方案?

我们在声明一个属性对应的setXxx方法时,通过形参给对应的属性赋值。如果形参名和属性名同名了,那么该如何在
方法内区分这两个变量呢?

解决方案:使用this。具体来讲,使用this修饰的变量,表示的是属性。没有用this修饰的,表示的是形参。

2. this可以调用的结构:成员变量、方法、构造器

3. this的理解:当前对象(在方法中调用时) 或 当前正在创建的对象(在构造器中调用时)

4 this的使用

4.1 this调用属性和方法

【针对于方法内的使用情况:(准确的说是非static修饰的方法)】

一般情况:我们通过对象a调用方法,可以在方法内调用当前对象a的属性或其他方法。此时,我们可以在属性和其他方法前
使用"this.",表示当前属性或方法所属的对象a。但是,一般情况下,我们都选择省略此"this."结构。
特殊情况:如果方法的形参与对象的属性同名了,我们必须使用"this."进行区分。使用this.修饰的变量即为属性(或成员变量),
没有使用this.修饰的变量,即为局部变量。

【针对于构造器内的使用情况:】
一般情况:我们通过构造器创建对象时,可以在构造器内调用当前正在创建的对象的属性或方法。此时,我们可以在属性和方法前
使用"this.",表示当前属性或方法所属的对象。但是,一般情况下,我们都选择省略此"this."结构。
特殊情况:如果构造器的形参与正在创建的对象的属性同名了,我们必须使用"this."进行区分。使用this.修饰的变量即为
属性(或成员变量),没有使用this.修饰的变量,即为局部变量。

案例

package com.atguigu01._this;  
  
public class PersonTest {  
    public static void main(String[] args) {  
        Person p1 = new Person();  
        p1.setAge(10);  
        System.out.println(p1.age);  

        Person p2 = new Person("Tom","tom@126.com");  
        System.out.println("name = " + p2.name + ", email = " + p2.email);  
     }  
}  
  
class Person{  
    String name;  
    int age;  

    String email;  

    public Person(){  

    }  

    public Person(String n){  
        name = n;  
        eat();  
    }  

    public Person(String name,String email){  
        this.name = name;  
        this.email = email;  
    }  


    public void setAge(int age){  
        this.age = age;  
    }  

    public int getAge(){  
        return this.age;  
    }  

    public void eat(){  
        System.out.println("人吃饭");  
        this.sleep();  
    }  
    public void sleep(){  
        System.out.println("人睡觉");  
    }  
}

4.2 this调用构造器

格式:"this(形参列表)"
我们可以在类的构造器中,调用当前类中指定的其它构造器
要求:"this(形参列表)"必须声明在当前构造器的首行
结论:"this(形参列表)"在构造器中最多声明一个
如果一个类中声明了n个构造器,则最多有n-1个构造器可以声明有"this(形参列表)"的结构

this调用构造器的案例

package com.atguigu01._this;  
  
public class UserTest {  
    public static void main(String[] args) {  

        //只创建了User类的1个对象。  
        User u1 = new User("Tom",12);  


    }  
}  
  
class User{  
  
    String name;  
    int age;  

    public User(){  
    //模拟对象创建时,需要初始化50行代码。  
    }  

    public User(String name){  
        this();  
        this.name = name;  
    }  

    public User(String name,int age){  
        this(name);  
        // this.name = name;  
        this.age = age;  
    }  

    // private void init(){  
    // //模拟对象创建时,需要初始化50行代码。  
    // }  
  
}