No constructor found错误 mybatis笔记

本文探讨了在使用MyBatis进行数据库映射时遇到的问题,并分享了解决方案。文章详细介绍了通过调整User类构造方法来解决对象比较时出现的不一致问题。

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

 

 

 

 

首先以为是mybatis映射数据库时参数不正确,在User类中添加了有该类的所有属性为参数的构造方法,未解决。

然后在User类中加上了无参构造,原问题解决。虽然正常情况无参构造方法可以自动生成调用,但在这里可能需要手动写入。

 

 

产生下面的错误

 

 

原因为u1与u虽然属性相同,但内存地址不同,即并不相等。

可通过比较属性值验证正确性。

<think>好的,我现在需要帮助用户解决Java中的编译错误no suitable constructor found for father(no arguments)”。首先,我需要理解这个错误的原因。根据之前的对话,用户已经询问过关于构造函数中super调用必须首行的问题,现在这个错误可能也是与父类构造函数相关的。 首先,错误信息指出没有找到合适的父类构造函数,特别是无参构造函数。Java在子类构造函数中如果没有显式调用super或this,编译器会自动插入super(),也就是调用父类的无参构造。如果父类没有无参构造,就会报这个错误。 接下来,我需要考虑用户可能的代码情况。用户可能在父类中定义了有参构造函数,但没有显式定义无参构造,导致子类默认调用super()时找不到。比如,用户可能在父类Father中写了Father(int x)这样的构造,但没有写Father(),这时候子类构造函数如果没有显式调用super(int)就会报错。 然后,我需要准备示例代码来说明问题。比如,父类Father有一个有参构造,子类Child的构造函数没有显式调用super,导致错误。同时,要给出解决方法,比如在父类中添加无参构造,或者在子类中显式调用super带参数。 另外,用户可能有其他情况,比如父类有无参构造,但由于某些原因不可见,比如权限修饰符的问题。比如父类的无参构造是private的,子类无法访问,这时候也会报错。但这种情况可能较少,但需要提及。 还要考虑到用户可能不了解Java默认构造函数的规则:如果一个类没有定义任何构造函数,编译器会自动生成一个默认的无参构造;但如果定义了有参构造,就不会自动生成,需要手动添加。 最后,总结解决方案,分点列出可能的解决步骤,并给出代码示例,确保用户能清晰理解如何修改代码。同时,可能需要提醒用户检查父类构造函数的访问权限,以及是否需要传递特定参数给父类构造。</think>--- ### **错误解释** 当子类构造函数中**未显式调用父类构造函数**,且父类**没有默认无参构造函数**时,Java编译器会抛出`no suitable constructor found for Father (no arguments)`错误。核心问题在于: 1. **父类未提供无参构造**:若父类**显式定义了有参构造**但未手动添加无参构造,则编译器**不会自动生成默认无参构造** 2. **子类未正确调用父类构造**:子类构造函数未通过`super(...)`显式调用父类存在的有参构造 --- ### **错误示例分析** ```java class Father { // 父类只有有参构造,无默认无参构造 Father(int age) { } // ❌ 未定义 Father() } class Son extends Father { Son() { // 编译器隐式插入 super(),但父类无无参构造 → 报错 } } ``` --- ### **解决方案** #### 方法1:**为父类添加无参构造** ```java class Father { Father() { } // ✅ 手动添加无参构造 Father(int age) { } } class Son extends Father { Son() { // 隐式调用 super() 不再报错 } } ``` #### 方法2:**显式调用父类有参构造** ```java class Father { Father(int age) { } } class Son extends Father { Son() { super(25); // ✅ 明确传递参数给父类构造 } } ``` #### 方法3:**通过子类构造参数传递父类所需参数** ```java class Son extends Father { Son(int fatherAge) { super(fatherAge); // 使用子类构造参数初始化父类 } } ``` --- ### **关键规则总结** | 场景 | 处理方式 | |-----------------------|------------------------------------------------------------------------| | 父类**没有无参构造** | 子类**必须显式调用**父类存在的有参构造 (`super(参数)`) | | 父类**有无参构造** | 子类可隐式调用`super()`,或显式调用其他构造 | | 需要同时保留多种构造 | 父类中**同时定义无参构造和有参构造** | --- ### **特殊注意事项** 1. **构造函数的可见性**:若父类无参构造是`private`的,子类仍然无法调用 2. **继承链传递**:多层继承时需确保**每一层父类**的构造调用正确 ```java class Grandfather { Grandfather(int x) { } } class Father extends Grandfather { Father() { super(10); } } // 必须传递参数 class Son extends Father { Son() { } } // 此时Father有无参构造,合法 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值