2016-07-17 54 views
2
class Date { 
    private int year; 
    private String month; 
    private int day; 

    public Date() { 
     month = "January"; 
     year = 1999; 
     day = 1; 
    }         //End of Constructor 1 

    public Date(int year, String month, int day) { 
     setDate(year, month, day); 
    }         //End of Constructor 2 

    public Date(int year) { 
     setDate(year, "January", 1); 
    }         //End of Constructor 3 

    public void setDate(int year, String month, int day) { 
     this.year = year; 
     this.month = month; 
     this.day = day; 
    }        //End of Constructor 4 
} 

public class Calendar { 
    public static void main(String[] args){  
     Date date1 = new Date(2009, "March", 3); 
     Date date2 = new Date(2010); 
     Date date3 = new Date(); 
    } 
} 

在上面的代码中,为date1,date2和date3调用哪个构造函数?在构造函数被调用后,如何打印date1,date2和date3的结果?Java初学者对构造函数的使用感到困惑

我试图System.out.println(date1)等,但它给了我奇怪的串像[email protected]

我期待看到2009年3月1日或什么之类的。

+0

1)你不应该影响内置的Java Date类... 2)你没有第四个构造函数...这是一个你调用的方法...'new Date()。setDate(0,“test”,0)' –

回答

2

当您尝试打印对象时,将调用其toString()方法,该方法被所有 java类从Object class(默认情况下为所有java类的超类)继承。因此,如果您需要打印对象的某些特定内容,则必须在类 中覆盖toString()方法。默认情况下,此方法打印 Class and its hash code。由于您未覆盖toString(),因此打印的字符串 包含对象类及其哈希码([email protected] ....)。 您的构造函数调用是由您传递给构造函数的参数决定的。 与date1一样,您按顺序通过了类型为int,string and int的3个参数。 这匹配您的构造函数2参数是int, string and int。 因此在你的date1对象构造中,调用构造函数2。 与date2类似,构造函数3被称为 ,对于date3,默认构造函数,即consturcot 1被调用。

的“构造4”您标记不是构造函数,它是一个简单的方法。 构造函数没有返回类型。

此外,打印为你在你的问题预计,覆盖类toString()方法,并在方法相应格式化结果得到预期的结果。

0

DATE1,DATE2,DATE3是一类日期的对象,并因此不能被打印。要打印它,你必须重写toString()方法。

String toString() { 

return year + " " + month + " " + day; 

} 

此外, 构造用于初始化只的字段。

public void setDate(int year, String month, int day) { 
    this.year = year; 
    this.month = month; 
    this.day = day; 
}        //End of Constructor 4 

这种方法是不是构造函数,因为构造函数总是有相同的名称,类别,并没有明确的返回类型。

+0

你能否解释第四种方法没有返回类型以及这个.___的功能是什么? – Wells

+1

我说它不是一个构造函数,因为它没有类的名称并且具有void返回类型。 –

+0

构造函数用于初始化类的实例。字段是其中的一部分,但这不是构造函数的唯一功能。 –

0

,你只需要叫构造函数的参数与定义的构造函数匹配,如果你没有定义任何参数,那么默认的构造函数会像

日期日期1 =新的日期(2009年被调用,“三月”,3 );它会调用

public Date(int year, String month, int day) { 
     setDate(year, month, day); 
    }         //End of Constructor 2 

Date date3 = new Date();将调用

Public Date() { 
     month = "January"; 
     year = 1999; 
     day = 1; 
    }         //End of Constructor 1 

Date date2 = new Date(2010);它会调用

public Date(int year) { 
    setDate(year, "January", 1); 
}         //End of Constructor 3 
+0

您的意思是“如果您没有定义任何构造函数,那么将会提供默认构造函数”?在OP的示例中,显式定义了构造函数,因此不提供默认构造函数。 –

+0

是的,没有构造器对象无法创建。如果你没有定义任何构造函数,那么编译器会提供一个默认的构造函数......! – Shailesh