Java中的 this 和 super

2023-10-16 11:00:03 浏览数 (1)

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

代表对象

代表父类对象的引用

当前对象本身

前置

只有在继承条件下才能使用

没有继承也可以使用

构造方法

父类构造

本类构造

0 人点赞