Java中的 this 和 super

226 阅读3分钟

1 this 关键字

1.1 this 访问本类属性

this 代表对当前对象的一个引用

  • 所谓当前对象,指的是调用当前类中方法或属性的那个对象

  • this只能在方法内部使用,表示对“调用方法的那个对象”的引用

  • this.属性名,表示本对象自己的属性

当对象的属性和方法或构造器中,名称相同时,用 this 以示区分。

public class Person{
    String name;
    public Person(String name){
        //用以区分对象中的属性名,参数名
        this.name = name;
    }
}

1.2 this 调用方法

1.2.1 构造方法

this关键字调用类的重载构造函数

this关键字必须位于构造函数的第一行

public class Person{
    String name;
    int age;
    public Person(int age){
        this.age = age;
    }
    public Person(String name){
        this(1);
        this.name = name;
    }
}

1.2.2 普通方法

this.方法名:表示当前对象自己的方法

public class Student{
    public void eat(){
        System.out.println("吃饭");
    }
    public void talk(){
        this.eat();
        System.out.println("吃完饭再说话");
    }
}

1.3 this 关键字使用注意

this不能用于静态方法和静态块

main方法也是静态的,所以 this 也不能用于 main 方法

2 super 关键字

2.1 super 访问构造函数

在继承中,子类的构造函数必须依赖父类提供的构造函数

super(参数列表) 访问父类的构造函数

super 调用父类的构造函数,必须位于子类构造函数中的第一行

//父类
public class Person{
    public Person(){}
}
//子类
public class Student extends Person{
    public Student(){
        super();
    }
}

在继承中,子类的构造函数必须依赖父类提供的构造函数

//父类中只有带参构造方法
public class Base {
	String name;
	int age;
	
	public Base(String name, int age){	
	}
}

//子类构造方法必须依赖父类
public class Son extends Base{
	public Son(){
		//如果父类提供的只有带参构造方法,子类的构造方法必须依赖父类提供的现有构造方法;
		//使用super(参数列表)去访问父类提供的构造函数,且必须明确写出参数;
		//super必须在第一行
		super("张三", 20);
	}
}

2.2 super 访问父类的属性

在子类的方法或构造器中,通过使用 super.属性 来访问父类属性

应用场景:

当子类和父类中定义了同名的属性时,想要调用父类中声明的属性,需要通过 super.属性 的方式来表明调用的是父类中声明的属性。

public class Car{
	//车架号
	int id;
}

class Benz extends Car{
	//内部车辆编号
	int id;	
	public void showInfo(){
		System.out.println("车架号是:" + super.id + " 内部车辆编号:" + id);
	}
}

2.3 super 访问父类的方法

在子类的方法或构造器中,通过使用 super.方法名 来调用父类的方法

public class Car{
	public void drive(){
		System.out.println("驾驶");
	}
}

class Benz extends Car{
	public Benz(){
		//访问父类方法
		super.drive();
	}
}

3 super 和 this 的区别

image.png

  • super() 是调用父类的构造函数,必须在构造函数的第一行;

  • this() 是调用本类的构造函数,必须在构造函数的第一行;

  • super() 和 this() 在同一个构造方法中,不能同时出现

superthis
代表对象代表父类对象的引用当前对象本身
前置只有在继承条件下才能使用没有继承也可以使用
构造方法父类构造本类构造

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 15 天,点击查看活动详情