资源说明:Java中的`super`关键字是用来引用父类的成员变量或方法的,它主要用于解决子类与父类之间的成员重名问题,以及在子类构造函数中调用父类构造函数的情况。下面将详细介绍`super`的几种用法以及与`this`的区别。
1. **子类构造函数中调用父类构造器**
当子类继承父类时,如果子类的构造函数需要调用父类的构造函数来初始化父类的部分状态,可以使用`super`关键字。例如:
```java
class Base {
Base() {
System.out.println("Base");
}
}
public class Child extends Base {
Child() {
super(); // 调用父类的构造方法,必须放在方法的首个语句
System.out.println("Child");
}
}
```
如果`super`不在子类构造函数的首行,编译器会报错,因为子类构造函数的第一个动作应该是调用父类的构造函数。
2. **访问父类被隐藏的成员变量和方法**
当子类中存在与父类同名的成员变量或方法时,`super`用来显式地访问父类中的同名成员。例如:
```java
class Parent {
String name = "Parent";
void printName() {
System.out.println(name);
}
}
class Child extends Parent {
String name = "Child";
void printName() {
System.out.println(name); // 访问子类的name
System.out.println(super.name); // 访问父类的name
super.printName(); // 调用父类的printName方法
}
}
```
在`Child`类的`printName`方法中,`name`变量被子类覆盖,但通过`super.name`仍然可以访问到父类的`name`。
3. **用`super`传递参数**
在子类构造函数中,`super`还可以用来调用父类具有参数的构造函数,直接传递参数。例如:
```java
class Base {
private String name;
Base(String name) {
this.name = name;
}
}
public class Child extends Base {
Child(String name) {
super(name); // 传递参数给父类的构造函数
}
}
```
这样,子类构造函数的参数可以直接用于初始化父类的成员变量。
4. **`super`与`this`的区别**
- `super`用于引用父类的成员,而`this`用于引用当前对象的成员。
- 在子类构造函数中,`super`用于调用父类构造器,`this`用于调用当前类的其他构造函数。
- `super`不能在静态上下文中使用,因为静态成员属于类而不属于类的实例,而`this`表示的是实例对象,因此可以在静态上下文中使用。
- 如果子类和父类中都有同名的成员变量或方法,`super`和`this`可以明确区分调用的是哪个。
总结,`super`关键字在Java中扮演着连接子类和父类的关键角色,它使得子类能够调用父类的构造函数、访问和调用被隐藏的父类成员,从而保证了继承的正确性和灵活性。同时,`super`与`this`的区别在于它们所指的对象不同,`super`指向父类,`this`指向当前对象。在编写多态程序时,熟练掌握这两个关键字的使用至关重要。
本源码包内暂不包含可直接显示的源代码文件,请下载源码包。