Java初学者对构造函数的使用感到困惑

时间:2016-07-17 03:57:33

标签: java class constructor

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的结果?

我尝试了System.out.println(date1)等等,但它给了我像u.Date@15db9742这样的奇怪字符串。

我期待看到2009年3月1日或类似的东西。

3 个答案:

答案 0 :(得分:2)

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

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

同样,要按照您在问题中的预期进行打印,请覆盖您班级中的toString()方法,并在该方法中相应地格式化结果,以获得预期结果。

答案 1 :(得分:0)

date1,date2,date3是类Date的对象,因此无法打印。要打印它,您必须覆盖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

此方法不是构造函数,因为构造函数始终与类具有相同的名称,并且没有显式的返回类型。

答案 2 :(得分:0)

你只需要将被调构的构造函数的参数与定义的构造函数匹配,如果你没有定义任何参数,那么将调用默认构造函数,如

日期date1 =新日期(2009年,“March”,3);它会调用

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

日期date3 =新日期();将调用

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

日期date2 =新日期(2010年);它会调用

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