2014-10-02 5 views
-1

안녕하세요 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; 
    } 
} 

2 등석 :

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; 
} 

답변

1

자바에서 생성자를 이해할 수 없다고 생각합니다. 생성자에서 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 
} 
+0

감사합니다! 지금 나는 나의 실수를 이해한다 :) – user3140559

0

이 줄 :

this.geboortedatum = new Datum(); 

기본 생성자를 사용하고 있습니다. 값을 설정하지 않습니다. 이 같은 생성자를 통해에 매개 변수를 전달하려고 :

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

당신이 (당신이 사용자의 입력을 요구 곳이다) 당신이 쓴 static 방법을 활용하려면 다음을 수행하십시오

this.geboortedatum = Datum.newDatum(); 
+0

이렇게 생성자를 사용하면 작동하는 것을 알 수 있습니다. 요점은 userInput을 통해 데이터를 처리해야한다는 것입니다. – user3140559

+0

@ user3140559 –

+0

Datum.newDatum()에 대한 newDatum() 변경이 불행히도 추가되지 않습니다. 둘 다 같은 방법을 참조하므로 이해가됩니다. – user3140559