父类中既有有无参构造又有有参构造,子类构造方法中还必须使用super()吗
时间: 2024-11-25 21:16:26 浏览: 38
当父类中有无参构造函数和有参构造函数时,子类的构造方法通常需要显式地调用`super()`。这是因为子类构造方法的第一步通常是初始化其父类的部分,无论父类是否提供默认构造函数。通过`super()`,可以确保正确的初始化过程。
如果子类没有覆盖父类的无参构造,那么子类构造方法会隐式调用父类的无参构造;如果有覆盖,则需要显式指定父类的有参构造。例如:
```java
public class Parent {
public Parent() {} // 无参构造
public Parent(int arg) { // 有参构造
//...
}
}
class Child extends Parent {
// 如果没有覆盖父类无参构造
public Child(int childArg) {
super(arg); // 错误写法,arg应改为childArg
//...
}
// 正确写法,覆盖了父类的有参构造
public Child(int parentArg, int childArg) {
super(parentArg); // 使用父类的有参构造
//...
}
}
```
相关问题
父类中既有有无参构造又有有参构造,子类构造方法神还必须使用super()吗
当父类中有既有无参构造函数也有有参构造函数时,子类构造方法通常需要显式调用`super()`。这是因为在子类初始化过程中,子类会隐式地调用其直接父类的构造方法,以便完成对父类成员变量的初始化。
如果你的子类没有提供自己的无参构造函数,那么默认它会调用父类的无参构造;如果子类有自己的无参构造,并希望跳过父类的初始化过程,此时就需要显式调用有参构造,如`super(param1, param2)`。
如果子类既想调用父类的有参构造又需要其他自定义操作,就必须先通过`super()`传递必要的参数,然后再进行其他的初始化工作。例如:
```java
public class Parent {
public Parent() {} // 无参构造
public Parent(int arg) { ... } // 有参构造
// 其他父类方法...
}
public class Child extends Parent {
public Child(String extraParam) {
super(特定值); // 如果有需要,传给父类的有参构造
// 自己的额外初始化...
}
}
```
Plane类和Car类。具体要求: 子类中必须要有有参构造器,且构造器要调用父类构造器实现传参。 子类分别从写父类的run方法,方法体要输出内容示例:“福特轿车正以100km/h/的速度在公路上行驶”。 定义测试类,利用多态创建父类引用类型指向子类具体对象(某一交通工具),然后调用方法run。
下面是示例代码:
```java
// 父类:交通工具类
public class Vehicle {
protected String name; // 名称
protected int speed; // 速度
public Vehicle(String name, int speed) {
this.name = name;
this.speed = speed;
}
public void run() {
System.out.println(name + "正以" + speed + "km/h的速度在行驶");
}
}
// 子类:飞机类
public class Plane extends Vehicle {
private int height; // 高度
public Plane(String name, int speed, int height) {
super(name, speed);
this.height = height;
}
@Override
public void run() {
System.out.println(name + "正以" + speed + "km/h的速度在" + height + "米的高空飞行");
}
}
// 子类:汽车类
public class Car extends Vehicle {
public Car(String name, int speed) {
super(name, speed);
}
@Override
public void run() {
System.out.println(name + "正以" + speed + "km/h的速度在公路上行驶");
}
}
// 测试类
public class TestVehicle {
public static void main(String[] args) {
Vehicle v1 = new Plane("波音747", 900, 10000); // 多态创建父类引用类型指向子类对象
Vehicle v2 = new Car("福特轿车", 100);
v1.run(); // 调用子类的run方法
v2.run();
}
}
```
输出结果:
```
波音747正以900km/h的速度在10000米的高空飞行
福特轿车正以100km/h的速度在公路上行驶
```
阅读全文