Java如何确定调用类中的哪个构造方法?
你的理解基本正确,Java选择调用哪个构造方法的核心依据是传入的参数列表,具体匹配逻辑如下:
构造方法匹配的核心规则
Java的构造方法重载解析,会按照传入参数的数量、类型、类型顺序三个维度逐一匹配,找到唯一符合要求的构造方法,整个匹配逻辑在编译期就会完成:
- 首先匹配参数数量:你示例中两个构造方法参数数量分别是4和1,只要你传入的参数数量是1,就只会匹配第二个接收Dbc类型的构造方法;如果传入4个参数,只会进入第一个构造方法的匹配逻辑。
- 数量匹配后会校验参数类型:如果多个构造方法参数数量相同,会按顺序校验每个位置的参数类型是否匹配,优先找完全匹配的实现。
- 存在类型隐式转换的场景下,Java会选择匹配度最高的构造方法,如果存在多个匹配度相同的构造方法,编译器会直接抛出歧义错误,不会运行。
对应你的代码示例验证
public class EpsMockEmailInfo { private String email; private String emailType; private String emailDate; private String status; // 构造方法1:4个String类型入参 public EpsMockEmailInfo (String email,String emailType,String emailDate,String status) { this.email = email; this.emailType = emailType; this.emailDate = emailDate; this.status = status; } // 构造方法2:1个Dbc类型入参 public EpsMockEmailInfo (Dbc dbc){ email = dbc.getString(1); emailType = dbc.getString(2); emailDate = dbc.getString(3); status = dbc.getString(4); } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getEmailType() { return emailType; } public void setEmailType(String emailType) { this.emailType = emailType; } public String getEmailDate() { return emailDate; } public void setEmailDate(String emailDate) { this.emailDate = emailDate; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } }
实际调用时的匹配效果:
- 调用
new EpsMockEmailInfo("test@example.com", "验证邮件", "2024-06-01", "发送成功")→ 匹配构造方法1 - 调用
new EpsMockEmailInfo(已实例化的Dbc对象)→ 匹配构造方法2
内容的提问来源于stack exchange,提问作者C.Ward
相关产品推荐
相关产品推荐

