“Super和this”的版本间的差异

来自姬鸿昌的知识库
跳到导航 跳到搜索
(建立内容为“https://www.bilibili.com/video/BV1bq4y1a73a/”的新页面)
 
第1行: 第1行:
 
https://www.bilibili.com/video/BV1bq4y1a73a/
 
https://www.bilibili.com/video/BV1bq4y1a73a/
 +
 +
super 代表父类,this 代表当前对象。
 +
 +
=== this.成员属性 ===
 +
先来看 this,<syntaxhighlight lang="java">
 +
public class Person {
 +
 +
    private String name;
 +
 +
    private Integer age;
 +
 +
    public void setName(String name) {
 +
        this.name = name;
 +
    }
 +
 +
    public void setAge(Integer age) {
 +
        this.age = age;
 +
    }
 +
}
 +
</syntaxhighlight>当我们用 IDE 自动生成 set 方法时,通常会用 this.成员属性来接收参数,因为参数名和成员属性名相同,
 +
 +
我们必须得指定成员属性才不会冲突,所以这里 this 的作用就是指定当前对象的成员属性。
 +
 +
 +
=== this.成员方法 ===
 +
既然都能指定当前对象的成员属性,那成员方法当然也可以通过 this 调用,<syntaxhighlight lang="java">
 +
public class Person {
 +
 +
    public void f1() {
 +
        //这两行代码完全等价
 +
        f2();
 +
        this.f2();
 +
    }
 +
 +
    public void f2() {
 +
        System.out.println("f2");
 +
    }
 +
 +
}
 +
</syntaxhighlight>不过成员方法不会像参数名那样命名冲突,所以我们一般省略 this 关键字,直接调用成员方法。
 +
 +
当然如果参数名没有冲突的情况下,<syntaxhighlight lang="java">
 +
public class Person {
 +
 +
    private String name;
 +
 +
    private Integer age;
 +
 +
    public void setName(String aName) {
 +
        //省去this关键字
 +
        name = aName;
 +
    }
 +
 +
    public void setAge(Integer age) {
 +
        this.age = age;
 +
    }
 +
}
 +
</syntaxhighlight>省略 this 关键字来直接调用成员属性也是没问题的。
 +
 +
 +
=== this 调用构造方法 ===
 +
成员属性和成员方法讲完了,还差一个构造方法。<syntaxhighlight lang="java">
 +
public class Person {
 +
    private String name;
 +
    private Integer age;
 +
 +
    public Person() {
 +
        this("匿名", 18);
 +
    }
 +
 +
    public Person(Integer age) {
 +
        this("匿名", age);
 +
    }
 +
 +
    public Person (String name) {
 +
        this(name, 18);
 +
    }
 +
 +
    public Person(String name, Integer age) {
 +
        this.name = name;
 +
        this.age = age;
 +
    }
 +
}
 +
 +
</syntaxhighlight>直接使用 this 加上括号就代表调用本类的构造方法,这种方式用在构造方法中可以复用其它构造方法的逻辑,
 +
 +
比如上段代码中最底部的构造器已经完成了属性的赋值逻辑,其它构造方法就没必要再写重复的赋值逻辑了,直接传值就好,this 关键字讲完。

2022年10月9日 (日) 05:42的版本

https://www.bilibili.com/video/BV1bq4y1a73a/

super 代表父类,this 代表当前对象。

this.成员属性

先来看 this,

public class Person {

    private String name;

    private Integer age;

    public void setName(String name) {
        this.name = name;
    }

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

当我们用 IDE 自动生成 set 方法时,通常会用 this.成员属性来接收参数,因为参数名和成员属性名相同,

我们必须得指定成员属性才不会冲突,所以这里 this 的作用就是指定当前对象的成员属性。


this.成员方法

既然都能指定当前对象的成员属性,那成员方法当然也可以通过 this 调用,

public class Person {

    public void f1() {
        //这两行代码完全等价
        f2();
        this.f2();
    }

    public void f2() {
        System.out.println("f2");
    }

}

不过成员方法不会像参数名那样命名冲突,所以我们一般省略 this 关键字,直接调用成员方法。 当然如果参数名没有冲突的情况下,

public class Person {

    private String name;

    private Integer age;

    public void setName(String aName) {
        //省去this关键字
        name = aName;
    }

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

省略 this 关键字来直接调用成员属性也是没问题的。


this 调用构造方法

成员属性和成员方法讲完了,还差一个构造方法。

public class Person {
    private String name;
    private Integer age;

    public Person() {
        this("匿名", 18);
    }

    public Person(Integer age) {
        this("匿名", age);
    }

    public Person (String name) {
        this(name, 18);
    }

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

直接使用 this 加上括号就代表调用本类的构造方法,这种方式用在构造方法中可以复用其它构造方法的逻辑,

比如上段代码中最底部的构造器已经完成了属性的赋值逻辑,其它构造方法就没必要再写重复的赋值逻辑了,直接传值就好,this 关键字讲完。