一、super介绍
在Java编程中,super
关键字用于引用父类的属性和方法。它是面向对象编程(OOP)中的一个重要特性,特别是在继承关系中。super
关键字的主要用途包括:
-
调用父类构造方法:在子类的构造方法中,可以使用
super()
来调用父类的构造方法,以初始化父类的属性。 -
访问父类的属性和方法:当子类和父类有同名的属性或方法时,可以使用
super
来明确指向父类的成员。
重要性
-
清晰的代码结构:使用
super
可以明确区分父类和子类的成员,避免混淆,提高代码的可读性。 -
增强代码复用:通过调用父类的方法和构造方法,子类可以重用父类的功能,减少重复代码。
-
支持多态性:在多态的上下文中,
super
可以帮助我们访问父类的方法,实现不同的行为。
生活中的类比
可以将super
关键字的使用比作家庭关系。在一个家庭中,孩子(子类)可以从父母(父类)那里继承特征和能力。比如,孩子可能有父母的某些特质(如眼睛颜色),但他们也可以有自己的特长(如音乐才能)。在这种情况下,super
就像是孩子在需要的时候去问父母关于某些特质的来源。
二、super
关键字的基本概念
1. 基本语法
在Java中,使用super
关键字来访问父类的成员。基本语法如下:
class Parent {
String name;
public Parent(String name) {
this.name = name;
}
public void display() {
System.out.println("Parent name: " + name);
}
}
class Child extends Parent {
String name;
public Child(String parentName, String childName) {
super(parentName); // 调用父类构造方法
this.name = childName; // 初始化子类属性
}
public void display() {
super.display(); // 调用父类方法
System.out.println("Child name: " + name);
}
}
三、super
关键字的应用示例
示例 1:调用父类构造方法
示例代码:
// 父类
class Animal {
String type;
// 父类构造方法
public Animal(String type) {
this.type = type;
}
public void display() {
System.out.println("Animal type: " + type);
}
}
// 子类
class Dog extends Animal {
String name;
// 子类构造方法
public Dog(String type, String name) {
super(type); // 调用父类构造方法
this.name = name; // 初始化子类属性
}
public void display() {
super.display(); // 调用父类方法
System.out.println("Dog name: " + name);
}
}
// 主类
public class Main {
public static void main(String[] args) {
Dog dog = new Dog("Mammal", "Buddy"); // 创建子类对象
dog.display(); // 调用子类方法
}
}
代码解释:
-
**父类
Animal
**:-
定义了一个属性
type
(动物类型)。 -
构造方法用于初始化
type
属性。 -
display()
方法用于输出动物类型。
-
-
**子类
Dog
**:-
使用
extends
关键字继承Animal
类。 -
在构造方法中,使用
super(type)
调用父类构造方法,以初始化父类的type
属性。 -
添加了一个特有属性
name
(狗的名字)。 -
重写了
display()
方法,调用父类的display()
方法并输出狗的名字。
-
-
**主类
Main
**:-
创建
Dog
类的对象dog
,并调用display()
方法,展示了动物的类型和狗的名字。
-
示例 2:访问父类的属性和方法
示例代码:
// 父类
class Vehicle {
String brand;
public Vehicle(String brand) {
this.brand = brand;
}
public void displayBrand() {
System.out.println("Vehicle brand: " + brand);
}
}
// 子类
class Car extends Vehicle {
String model;
public Car(String brand, String model) {
super(brand); // 调用父类构造方法
this.model = model; // 初始化子类属性
}
public void displayDetails() {
super.displayBrand(); // 调用父类方法
System.out.println("Car model: " + model);
}
}
// 主类
public class Main {
public static void main(String[] args) {
Car car = new Car("Toyota", "Camry"); // 创建子类对象
car.displayDetails(); // 调用子类方法
}
}
代码解释:
-
**父类
Vehicle
**:-
定义了一个属性
brand
(车辆品牌)。 -
构造方法用于初始化
brand
属性。 -
displayBrand()
方法用于输出车辆品牌。
-
-
**子类
Car
**:-
使用
extends
关键字继承Vehicle
类。 -
在构造方法中,使用
super(brand)
调用父类构造方法,以初始化父类的brand
属性。 -
添加了一个特有属性
model
(车型)。 -
定义了
displayDetails()
方法,调用父类的displayBrand()
方法并输出车型。
-
-
**主类
Main
**:-
创建
Car
类的对象car
,并调用displayDetails()
方法,展示了车辆的品牌和车型。
-
四、super
关键字的特点
-
调用父类构造方法:在子类构造方法中,必须在第一行使用
super()
来调用父类的构造方法(如果不显式调用,Java会自动调用无参构造方法)。 -
访问父类成员:可以使用
super
关键字来访问父类的属性和方法,尤其是在子类中存在同名成员时。 -
不能在静态上下文中使用:
super
关键字只能在实例方法或构造方法中使用,不能在静态方法中使用。