Java中super用法详解:构造器调用与this区别

0 下载量 187 浏览量 更新于2024-08-31 收藏 61KB PDF 举报
Java中`super`关键字在面向对象编程中起着至关重要的作用,尤其是在继承关系中。本文将详细介绍`super`的几种常见用法,并与`this`进行对比,帮助理解这两个关键字在构造函数、成员变量和方法调用中的区别。 1. **构造函数中的`super`**: 在子类的构造函数中,调用父类构造函数(`super()`)必须放在首位。这是因为在执行子类构造函数时,首先会调用父类的构造函数,初始化父类的成员变量。如`Checket`类所示: ```java class Base { Base() { System.out.println("Base"); } } public class Checket extends Base { // 必须放在首位 Checket() { super(); // 调用父类构造方法 System.out.println("Checket"); } } ``` 如果`super`被放在其他语句之后,这部分语句将覆盖父类的构造行为,导致父类构造方法的执行被重新定义。 2. **处理同名成员变量和方法**: Java中存在方法和字段的重载问题,子类可以定义与父类同名的成员。这时,子类的同名变量或方法会遮盖父类的。若需要访问父类的同名成员,需要通过`super`关键字,如`Country`和`City`类: ```java class Country { String name; void value() { name = "China"; } } class City extends Country { String name; void value() { name = "Hefei"; // 显示父类的name值 System.out.println(name); // 子类的name System.out.println(super.name); // 父类的name } } ``` 不调用`super.value()`时,`super.name`会返回父类`Country`中`name`的默认值(`null`),表明了`this`和`super`在访问属性上的优先级。 总结来说,`super`在Java中主要用于: - **构造函数中**:确保正确地初始化父类的构造过程,即使在子类中有自定义逻辑。 - **访问父类成员**:当子类有同名成员时,通过`super`来明确调用父类的特定方法或访问其成员变量,避免命名冲突。 - **方法重写**:避免无意间覆盖父类的行为,确保代码的继承性和一致性。 理解`super`与`this`的区别是编程实践中的关键,`this`用于引用当前对象的实例,而`super`则代表父类的实例。两者在不同的上下文中发挥着不同的作用。