Java - 静态构造函数

时间:2014-10-02 18:40:33

标签: java

嘿那里有Stackoverflowers,

我刚刚开始用Java编程,遇到了一个关于打印对象的奇怪问题。当创建类型为gast的新对象时,用户必须输入他或她的生日。这个工作正常,但是,如果我尝试将其打印出来,我会返回0-0-0。这是为什么?顺便说一句,如果我直接使用参数构造函数创建一个新的数据,它可以正常工作。在哪里解决问题?我无法弄明白。我希望你们能帮助我。

提前致谢!

public class Datum {
    private static String patroon = "\\d{2}-\\d{2}-\\d{4}";
    public int dag;
    public int maand;
    public int jaar;

    Datum(int dag, int maand, int jaar) {
        System.out.print("constructor: " + dag);
        this.dag = dag;
        System.out.println(", dag: " + this.dag);
        this.maand = maand;
        this.jaar = jaar;
    }
    Datum() {
        newDatum();
    }

    /*  */
    public static Datum newDatum() {
        String input = Opgave5.userInput("Geboortedatum gast"); 
        boolean b = input.matches(patroon); 

        if (b) {
            String[] str = input.split("-");

            int dag = Integer.parseInt(str[0]);
            int maand = Integer.parseInt(str[1]);
            int jaar = Integer.parseInt(str[2]);

            Datum datum = new Datum(dag, maand, jaar);
            System.out.println(datum);
            return datum;
        }
        else {
            return new Datum();
        }
    }

    public String toString() {
        return this.dag + "-" + this.maand + "-" + this.jaar;
    }
}

第二课:

Gast() {
    this.firstName = Opgave5.userInput("Voornaam gast");
    this.lastName = Opgave5.userInput("Achternaam gast");
    this.geboortedatum = new Datum();

    System.out.println("gast: " + this.geboortedatum); // <--- this prints out 0-0-0

}

public String toString() {
    return this.firstName + " " + this.lastName + " " + this.geboortedatum;
}

2 个答案:

答案 0 :(得分:1)

我认为你不了解Java中的构造函数。您只是忽略构造函数中newDatum()的结果。此外,如果它确实具有预期的效果,它可能会在newDatum()内的构造函数调用中无限递归。使用这样的东西;允许newDatum()编辑实例将起作用:

Datum() {
    newDatum(this);
}

public static void newDatum(Datum instance) {
    String input = Opgave5.userInput("Geboortedatum gast"); 
    boolean b = input.matches(patroon); 

    if (b) {
        String[] str = input.split("-");

        int dag = Integer.parseInt(str[0]);
        int maand = Integer.parseInt(str[1]);
        int jaar = Integer.parseInt(str[2]);

        instance.dag = dag;
        instance.maand = maand;
        instance.jaar = jaar;
        System.out.println(instance);
    }
    else {
        new Datum();
    }
    // ^^ Above code may be buggy, see my answer above code
}

答案 1 :(得分:0)

这一行:

this.geboortedatum = new Datum();

使用默认构造函数。这将不设置任何值。尝试传递via构造函数中的参数,如下所示:

this.geboortedatum = new Datum(1, 2, 3);

如果您想利用您编写的static方法(这是您要求用户输入的位置),请执行以下操作:

this.geboortedatum = Datum.newDatum();