this的本质就是:创建好的对象的地址 -> 代表当前对象
构造方法是创建java对象的重要途经,通过new关键字调用构造器时,构造器返回该类对象,但是该对象并不完全由构造器创建。
创建对象分为四步:
因为在调用构造方法前,对象已被创建,所以this可以在构造方法中充当当前对象
- public construct(int id, String name){
- this.id = id;
- this.name = name;
- }
举个例子,分析一下创建对象的过程
- class Person {
- int age;
- String sex;
- public Person(int age, String sex) {
- this.age = age;
- this.sex = sex;
- }
- }
-
- public class Demo {
-
- public static void main(String[] args) {
- Person person = new Person(22 ,"boy");
- }
- }

this可以调用重载的构造方法
- class Person {
- int age;
- String sex;
- String name;
- public Person(int age, String sex) {
- this.age = age;
- this.sex = sex;
- }
-
- public Person(int age,String sex,String name){
- this(age,sex); //this()访问其他构造方法
- this.name = name;
- }
- }
访问父类的构造函数:可以使用 super() 函数访问父类的构造函数,从而委托父类完成一些初始化的工作。应该注意到,子类一定会调用父类的构造函数来完成初始化工作,默认调用父类的无参构造函数,如果子类需要调用父类其它构造函数,那么就可以使用 super() 函数,但是必须位于构造方法第一句。(所以在构造器中this和super不能共存,只能用一个)
访问父类的成员:如果子类重写了父类的某个方法,可以通过使用 super 关键字来引用父类的方法实现。
- public class SuperDemo {
-
- protected int x;
- protected int y;
- public SuperDemo(int x, int y) {
- this.x = x;
- this.y = y;
- }
-
- public void func() {
- System.out.println("调用父类方法");
- }
- }
-
- public class SuperExtend extends SuperDemo {
- private int z;
- public SuperExtend(int x, int y, int z) {
- super(x, y); //super()访问父类构造方法
- this.z = z;
- }
-
- @Override
- public void func() {
- super.func(); //super引用父类方法实现
- System.out.println("调用子类方法");
- }
- }
- 运行结果:
- 调用父类方法
- 调用子类方法
| this | super | |
|---|---|---|
| 访问属性 | 从本类属性开始访问,本类有并且可以访问则访问;没有从父类中查找,父类有并且可以访问则访问;如果父类没有则继续向上找直到Object类 | 直接从父类中开始查找,直到Object类 |
| 调用方法 | 调用本类方法,本类如果没有此方法或则不能访问,则从父类中调用,以此类推,直到Object类 | 直接调用父类方法,直到Object类 |
总而言之,this是先从本类开始查找属性/方法,super是直接从其父类开始查找属性/方法