You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 13:45:04