有关子类构造函数的问题

本文探讨了Java中父类与子类构造函数的关系,特别是在父类自定义了有参构造函数的情况下如何正确调用super关键字。同时,详细解释了类加载时的顺序,包括静态代码块、成员变量初始化等过程。

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

如果父类自定义了有参构造函数,则子类无论定义构造函数与否,定义有参构造函数与否,都会报错,正确的做法是在子类的构造方法中添上super(参数),以表明子类构造之前先构造父类,而这句话必须放在第一句,否则报"Constructor call must be the first statement in a constructor"的错误,想想也是,如果这句话之前有了别的内容,岂不是先执行子类的构造函数了。据此引出类的加载顺序问题。

经过上网查资料,得知 首先执行 父类的静态代码块/初始化静态变量(两者优先级相同),然后执行子类的静态代码/初始化静态变量(两者优先级相同,谁写在前面谁先执行),然后初始化父类成员变量/执行代码块{}(两者优先级相同),接着父类的构造器,然后子类的成员变量/代码块,最后子类的构造器。

PS:今天才知道java一个文件可以写多个类,只不过最多一个public类,但编译的时候有几个类就生成几个.class文件(内部类也是一样),这样验证起来方便多了。

### MATLAB 中子类构造函数与超类构造函数的调用关系 在MATLAB中,当设计面向对象程序时,子类可以从其超类继承属性和方法。对于构造函数而言,如果希望子类能够正确初始化并保留来自超类的行为,则需适当处理两者之间的交互。 #### 隐式传递数至超类构造函数 MATLAB允许将数从默认子类构造函数隐式传递给超类构造函数[^1]。这意味着,在某些情况下,即使不为子类专门编写构造函数,只要存在合适的超类构造函数签名匹配,MATLAB也会自动完成必要的初始化工作。这种方式简化了代码逻辑,减少了不必要的重复编码需求。 #### 显式调用超类构造函数 然而,在更多复杂场景下,可能需要更精细地控制这一过程。此时可以通过显式的语法形式来实现这一点: ```matlab classdef ChildClass < ParentClass properties prop3; end methods function obj = ChildClass(val1, val2, val3) % 调用父类构造器 obj@ParentClass(val1, val2); % 设置自己的额外属性 obj.prop3 = val3; end end end ``` 上述例子展示了如何在一个自定义的`ChildClass`构造函数内部调用`ParentClass`的构造函数,并传入相应的数以确保超类部分被恰当初始化[^4]。注意这里使用的是`obj@ParentClass(...)`这样的语句格式来进行调用。 #### 构造函数的作用范围 值得注意的是,默认情况下每个类都会有一个简单的无构造函数用于创建实例;但如果开发者提供了带有数列表的新构造函数,则会覆盖这个默认版本[^2]。因此,在涉及多层继承结构的时候尤其要注意保持良好的接口兼容性和合理的数传播机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值