Java 中的关键字 this
和 super
在面向对象编程中起着重要的作用。它们用于访问当前对象和父类对象的成员变量和方法。本文将深入探讨 this
和 super
的用法,以及如何在 Java 中正确使用它们。
this
关键字
在 Java 中,this
关键字是一个引用,它引用当前对象。当我们创建一个对象时,内存中会为该对象分配空间,并在创建对象时隐式地将 this
引用指向该对象。使用 this
关键字可以访问当前对象的成员变量和方法。
访问成员变量
使用 this
关键字可以访问当前对象的成员变量。当成员变量与局部变量同名时,使用 this
关键字可以区分它们。
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
public void printName() {
System.out.println("My name is " + this.name);
}
}
在上面的代码示例中,this.name
引用了当前对象的成员变量 name
。
调用构造方法
this
关键字还可以在构造方法中调用其他构造方法。这在构造方法重载时非常有用。
public class Person {
private String name;
private int age;
public Person() {
this("John Doe", 18);
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
在上面的代码示例中,第一个构造方法通过 this
关键字调用了第二个构造方法,并传递了默认的参数值。
super
关键字
super
关键字用于访问父类的成员变量和方法。它可以用于以下几种情况:
- 调用父类的构造方法
- 调用父类的成员变量
- 调用父类的方法
调用父类的构造方法
当子类需要调用父类的构造方法时,可以使用 super
关键字。
public class Student extends Person {
private int grade;
public Student(String name, int age, int grade) {
super(name, age);
this.grade = grade;
}
}
在上面的代码示例中,super(name, age)
调用了父类 Person
的构造方法。
调用父类的成员变量和方法
使用 super
关键字可以访问父类的成员变量和方法。当子类和父类具有同名的成员变量或方法时,使用 super
关键字可以区分它们。
public class Student extends Person {
private int grade;
public Student(String name, int age, int grade) {
super(name, age);
this.grade = grade;
}
public void printInfo() {
System.out.println("Name: " + super.getName());
System.out.println("Age: " + super.getAge());
System.out.println("Grade: " + this.grade);
}
}
在上面的代码示例中,super.getName()
和 super.getAge()
调用了父类 Person
的方法。
使用示例
下面我们通过一个完整的示例来演示 this
和 super
关键字的用法。
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return this.name;
}
public int getAge() {
return this.age;
}
}
public class Student extends Person {
private int grade;
public Student(String name, int age, int grade) {
super(name, age);
this.grade = grade;
}
public void printInfo() {
System.out.println("Name: " + super.getName());
System.out.println("Age: " + super.getAge());
System.out.println("Grade: " + this.grade);
}
}
public class Main {
public static void main(String[] args) {
Student student = new Student("Tom", 16, 10);
student.printInfo();
}
}
在上面的示例中,Person
类表示一个人,Student
类继承自 Person
类,并增加