Java 如何知道在 class 中使用哪个构造函数?

How does Java know which constructor to use in a class?

我正在努力更好地理解 OOP。我想知道 Java 如何知道要使用哪个构造函数。例如,我下面有一个 class 和 2 个构造函数。一个采用 DBC 值,另一个采用一些字符串。它是知道你通过它还是我理解错了?

  public class EpsMockEmailInfo {
    
        private String email;
        private String emailType;
        private String emailDate;
        private String status;
        
        public EpsMockEmailInfo (String email,String emailType,String emailDate,String status) {
            this.email = email;
            this.emailType = emailType;
            this.emailDate = emailDate;
            this.status = status;
        }
    
        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;
        }
    
    }

方法签名匹配

通过将声明参数的数量和类型与调用参数的数量和类型相匹配来选择构造函数。

如果传递四个 String 个对象,则执行 public EpsMockEmailInfo (String email,String emailType,String emailDate,String status) { … }

如果传递单个 Dbc 对象,则会执行 public EpsMockEmailInfo (Dbc dbc) { … }

形式上,方法名称与其参数的数量和类型的组合称为 method signature. Method signatures are unique within an app, meaning, you cannot write two methods with the same fully-qualified 名称以及相同数量和类型的参数;编译器不允许。所以 JVM 总是知道调用哪个方法。

在Java中,构造函数或方法的真实名称,即用于标识和查找的标识符,包括编号和参数的类型。这称为方法或构造函数 signature.

几乎所有您可能想象的方法名称的使用实际上都是基于签名的。 重载,也就是我们所说的对多个不同的方法或构造函数使用相同的名称,只存在于我们的脑海中。在 Java 中,foo(int)foo(boolean) 彼此之间的差异与它们在 bar(int) 中的差异一样大。