书接上回Java继承讲解(第一节)-CSDN博客
我们引出了super关键字我们通过对比的方法学习这个关键字
在Java中,super
和 this
是两个非常重要的关键字,主要用于访问类中的成员变量、方法以及构造方法。它们的作用各不相同,但都与类的继承关系和实例化过程有关。接下来我将分别讲解 super
和 this
的三个常用用法
一、super
关键字的三种用法
1. super
用于调用父类的成员变量
当子类和父类有同名的成员变量时,子类默认会隐藏父类的成员变量。要访问父类的同名成员变量,必须使用 super
关键字。
示例:
class Animal {
public String name = "动物";
}
class Dog extends Animal {
public String name = "狗";
public void displayNames() {
System.out.println("子类名字: " + name); // 访问子类的name
System.out.println("父类名字: " + super.name); // 通过super访问父类的name
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.displayNames();
}
}
运行结果:
子类名字: 狗
父类名字: 动物
解释:
- 通过
super.name
,我们可以访问父类Animal
中的成员变量name
,而name
直接指向的是Dog
类中的成员变量。
2. super
用于调用父类的成员方法
当子类重写了父类的方法时,默认调用的是子类的方法。如果我们想要在子类中调用父类的版本,可以使用 super
关键字。
示例:
class Animal {
public void eat() {
System.out.println("动物正在吃东西");
}
}
class Dog extends Animal {
@Override
public void eat() {
System.out.println("狗正在吃东西");
}
public void displayEat() {
super.eat(); // 调用父类的eat方法
eat(); // 调用子类的eat方法
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.displayEat();
}
}
运行结果:
动物正在吃东西
狗正在吃东西
解释:
super.eat()
调用了父类Animal
的eat()
方法,而eat()
则是子类Dog
自己重写的方法。
3. super
用于调用父类的构造方法
在子类的构造方法中,默认会调用父类的无参构造方法。如果父类有参数构造方法,我们可以使用 super()
来显式调用父类的构造方法。
示例:
class Animal {
public Animal(String name) {
System.out.println("父类构造方法,动物的名字是: " + name);
}
}
class Dog extends Animal {
public Dog() {
super("狗"); // 调用父类的带参构造方法
System.out.println("子类构造方法");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
}
}
运行结果:
父类构造方法,动物的名字是: 狗
子类构造方法
解释:
super("狗")
显式调用了父类的带参构造方法,并传递参数"狗"
,这确保在子类构造方法执行之前,父类的构造方法能够先执行。
二、this
关键字的三种用法
1. this
用于访问当前对象的成员变量(this.成员变量)
当方法的参数名与成员变量名相同,成员变量会被隐藏,此时可以使用 this
关键字来区分参数和当前对象的成员变量。
示例:
class Dog {
private String name;
public Dog(String name) {
this.name = name; // 使用this来区分成员变量和参数
}
public void display() {
System.out.println("狗的名字是: " + name);
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog("小黑");
dog.display();
}
}
运行结果:
狗的名字是: 小黑
解释:
this.name = name;
中的this.name
表示当前对象的成员变量name
,而右边的name
是构造方法的参数。
2. this
用于调用当前类的其他方法(this.方法)
this
可以在一个方法中调用当前对象的另一个方法。这样可以避免重复代码,并且保证调用的都是当前对象的方法。
示例:
class Dog {
public void bark() {
System.out.println("狗在叫");
}
public void play() {
this.bark(); // 调用当前类的bark方法
System.out.println("狗在玩");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.play();
}
}
运行结果:
狗在叫
狗在玩
解释:
this.bark()
显式调用了bark()
方法。虽然可以直接调用bark()
方法而不使用this
,但this
关键字明确表明了调用的是当前对象的bark()
方法。
3. this
用于调用当前类的构造方法 this( )
在一个构造方法中,可以使用 this()
调用当前类的另一个构造方法,以避免重复初始化代码。注意:this()
必须是构造方法中的第一条语句。
示例:
class Dog {
private String name;
private int age;
// 调用带一个参数的构造方法
public Dog(String name) {
this(name, 0); // 调用另一个构造方法
}
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
public void display() {
System.out.println("狗的名字是: " + name + ", 年龄是: " + age);
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog("小黑");
dog.display();
}
}
运行结果:
狗的名字是: 小黑, 年龄是: 0
解释:
- 在
Dog(String name)
构造方法中,使用了this(name, 0)
来调用带两个参数的构造方法,这避免了重复初始化代码。
三、super
和 this
的区别
特性 | this | super |
---|---|---|
作用对象 | 当前类的对象(即自身) | 父类的对象 |
访问成员 | 访问当前类的成员变量或成员方法 | 访问父类的成员变量或成员方法 |
构造方法调用 | 调用当前类的其他构造方法 | 调用父类的构造方法 |
调用顺序限制 | this() 必须是构造方法的第一行语句 | super() 也必须是构造方法的第一行语句 |
多态性 | 当前对象的引用 | 父类对象的引用 |