面向对象编程(进阶) 1-this关键字
Zemise
Zemise
发布于 2023-06-12 / 31 阅读 / 0 评论 / 1 点赞

面向对象编程(进阶) 1-this关键字

1.1 this是什么?

在Java中,this关键字不算难理解,它的作用和其词义很接近。

  • 它在方法(准确的说是实例方法或非static的方法)内部使用,表示调用该方法的对象

    • 这个应该是最常见的,通常在非static方法内,调用当前类的某些属性
  • 它在构造器内部使用,表示该构造器正在初始化的对象

    • 比如之前的写过的一段代码,其中的this就是构造器内部使用,this调用的是第一个构造函数来初始化当前对象
    /**
     * This class provides a method to take a PNG screenshot of a web page using the ScreenshotMachine API.
     *
     * @author Zemise
     * @since 2023/4/24
     */
    public class ApiScreenshot {
        private final ApiOptions options;
        /**
         * The API key required to access the ScreenshotMachine API.
         */
        private final String apiKey;
    
        /**
         * 构造函数,初始化ApiScreenshot对象。
         *
         * @param apiKey  ScreenMachine Key
         * @param options 截图选项
         */
        public ApiScreenshot(String apiKey, ApiOptions options) {
            this.apiKey = apiKey;
            this.options = options;
        }
    
        /**
         * 构造函数,初始化ApiScreenshot对象。
         *
         * @param apiKey ScreenMachine Key
         */
        public ApiScreenshot(String apiKey) {
            this(apiKey, null);
        }
    
    

1.2 什么时候使用this

1.2.1 实例方法或构造器中使用当前对象的成员

在实例方法或构造器中,如果使用当前类的成员变量或成员方法可以在其前面添加this,增强程序的可读性。不过,通常我们都习惯省略this

但是,当形参与成员变量同名时,如果在方法内或构造器内需要使用成员变量,必须添加this来表明该变量是类的成员变量。即:我们可以用this来区分成员变量局部变量。比如:

public class Student{
  String name;
  public void setName(String name){
    /*
    	前者为成员变量
    	后者为局部变量
    */
    this.name = name;
  }
}

另外,使用this访问属性和方法时,如果在本类中未找到,会从父类中查找。这个在继承中会讲到。

1.2.2 同一个类中构造器互相调用

this可以作为一个类中构造器相互调用的特殊格式。

  • this():调用本类的无参构造器
  • this(实参列表):调用本类的有参构造器
public class Student {
    private String name;
    private int age;
 
    // 无参构造
    public Student() {
//        this("",18);//调用本类有参构造器
    }
 
    // 有参构造
    public Student(String name) {
        this();//调用本类无参构造器
        this.name = name;
      
      	// 也可以这样调用
      	// this("zemise", 18)
    }
    // 有参构造
    public Student(String name,int age){
        this(name);//调用本类中有一个String参数的构造器
        this.age = age;
    }
 
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
 
    public String getInfo(){
        return "姓名:" + name +",年龄:" + age;
    }
}

注意:

  • 不能出现递归调用。比如,调用自身构造器。
    • 推论:如果一个类中声明了n个构造器,则最多有 n - 1个构造器中使用了"this(形参列表)"
  • this()和this(实参列表)只能声明在构造器首行
    • 推论:在类的一个构造器中,最多只能声明一个"this(参数列表)"

评论