1 this 关键字
1.1 this 访问本类属性
this 代表对当前对象的一个引用
- 所谓当前对象,指的是调用当前类中方法或属性的那个对象
- this只能在方法内部使用,表示对“调用方法的那个对象”的引用
- this.属性名,表示本对象自己的属性
当对象的属性和方法或构造器中,名称相同时,用 this 以示区分。
代码语言:javascript复制public class Person{
String name;
public Person(String name){
//用以区分对象中的属性名,参数名
this.name = name;
}
}
1.2 this 调用方法
this关键字调用类的重载构造函数
this关键字必须位于构造函数的第一行
代码语言:javascript复制public class Person{
String name;
int age;
public Person(int age){
this.age = age;
}
public Person(String name){
this(1);
this.name = name;
}
}
this.方法名:表示当前对象自己的方法
代码语言:javascript复制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 调用父类的构造函数,必须在子类构造函数的第一行
代码语言:javascript复制//父类
public class Person{
public Person(){}
}
//子类
public class Student extends Person{
public Student(){
super();
}
}
在继承中,子类的构造函数必须依赖父类提供的构造函数
代码语言:javascript复制//父类中只有带参构造方法
public class Base {
String name;
int age;
public Base(String name, int age){
}
}
代码语言:javascript复制//子类构造方法必须依赖父类
public class Son extends Base{
public Son(){
//如果父类提供的只有带参构造方法,子类的构造方法必须依赖父类提供的现有构造方法;
//使用super(参数列表)去访问父类提供的构造函数,且必须明确写出参数;
//super必须在第一行
super("张三", 20);
}
}
2.2 super访问父类的属性
在子类的方法或构造器中,通过使用 super.属性 来访问父类属性
应用场景:
当子类和父类中定义了同名的属性时,想要调用父类中声明的属性,需要通过 super.属性 的方式来表明调用的是父类中声明的属性。
代码语言:javascript复制public class Car{
//车架号
int id;
}
class Benz extends Car{
//内部车辆编号
int id;
public void showInfo(){
System.out.println("车架号是:" super.id " 内部车辆编号:" id);
}
}
2.3 super 访问父类的方法
在子类的方法或构造器中,通过使用 super.方法名 来调用父类的方法
代码语言:javascript复制public class Car{
public void drive(){
System.out.println("驾驶");
}
}
class Benz extends Car{
public Benz(){
//访问父类方法
super.drive();
}
}
3 super 和 this 的区别
super() 是调用父类的构造函数,必须在构造函数的第一行
this() 是调用本类的构造函数,必须在构造函数的第一行
super() 和 this() 在同一个构造方法中,不能同时出现
super | this | |
---|---|---|
代表对象 | 代表父类对象的引用 | 当前对象本身 |
前置 | 只有在继承条件下才能使用 | 没有继承也可以使用 |
构造方法 | 父类构造 | 本类构造 |