继承关系中子类的构造函数

本文探讨了Java中子类构造函数与父类构造函数的关系,特别是当子类没有显式定义与父类相同构造函数时的问题。通过具体的代码示例解释了Java编译器的行为及其原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


package scjp;

public class Demo78 {
protected int i;
Demo78(int i){
this.i=i;
}
}

class B{

}

class C extends Demo78{

}

class D extends Demo78{
D(){
System.out.println(i);
}
}

class E{
class Demo78{

}
}

class Demo78{

}




C,D会报错,请问为什么?

因为:C,D没有与超类相同的构造函数.C中没有定义构造函数所以JVM会自动添加一个空的构造函数,但是Demo78这个父类没有空的构造函数,这里又是另外一个问题:

如果一个类没有写构造函数的话JVM会给它添加一个空的构造函数,如果它写了构造函 数还会不会添加这个空的构造函数呢?不会的。

所以也就是Demo78中没有这个空的构造函数,所以C是错的。

关于D答案是一样的,虽然它的这个构造函数不是JVM添加的。
在SystemVerilog中,子类调用父构造函数是面向对象编程中的一个核心概念,用于确保子类实例的正确初始化。当定义一个子类时,其构造函数通常需要调用父构造函数以完成基部分的初始化[^1]。 ### 子类调用父构造函数的方法 子类通过 `super.new()` 显式调用父构造函数。这种调用必须发生在子类构造函数的第一条语句,以确保父成员变量和逻辑先于子类进行初始化[^1]。 #### 示例代码 ```systemverilog class father; int flow_id; function new(int id); $display("new father"); flow_id = id; endfunction: new endclass: father class son extends father; function new(); super.new(30); // 调用父构造函数并传递参数 $display("new son, flow_id='d%0d", flow_id); endfunction: new endclass: son ``` 在这个例子中,`son` 继承自 `father` 。`son` 的构造函数通过 `super.new(30)` 调用父 `father` 的构造函数,并传入参数 30。这样,在创建 `son` 对象时,首先会执行 `father` 的构造逻辑,随后执行 `son` 特有的初始化操作[^2]。 #### 注意事项 - 如果父没有默认构造函数(即所有构造函数都需要参数),那么子类必须显式调用父构造函数并提供所需的参数。 - 在某些情况下,如果父有默认构造函数(无参构造函数),子类可以省略对 `super.new()` 的调用,此时编译器会自动插入对父默认构造函数的调用。 - 如果子类构造函数需要额外的参数,则这些参数可以在调用 `super.new()` 后处理,或者根据需求调整顺序以满足特定逻辑。 ### 构造流程详解 1. **父构造函数调用**:子类构造函数的第一步是调用父构造函数,这一步由 `super.new(...)` 实现。 2. **成员变量初始化**:父构造函数执行完成后,子类成员变量按照定义时提供的默认值进行初始化。如果没有默认值,则不会被初始化。 3. **子类构造函数体执行**:成员变量初始化完成后,子类构造函数中的其余代码将被执行,完成特定于子类的初始化工作。 ### 相关问题 - SystemVerilog 中如何实现多级继承? - 如何在 SystemVerilog 中使用虚方法? - 如何在 SystemVerilog 中进行型转换?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值