2012-01-14 4 views
0

저는 java를 시험 중입니다. 몇 가지 문제가있는 것 같습니다. 유일한 문제는 Stars 클래스의 확장을 추가 할 때 생성자가 Stars test = new Star()와 같은 선언없이 호출되는 것입니다.Java - extends는 다른 클래스의 생성자를 호출하는 것처럼 보입니다.

Knight.java

import javax.swing.JOptionPane; 

public class Knight extends Stars { 
    private String name; 
    private int health, battles, age, gold; 

    public Knight() { 
     name = JOptionPane.showInputDialog("What is the knight's name?"); 
     String message = String.format("How much health does %s have?", name); 
     health = Integer.parseInt(JOptionPane.showInputDialog(message)); 
     message = String.format("How many battles has %s been in?", name); 
     battles = Integer.parseInt(JOptionPane.showInputDialog(message)); 
     message = String.format("How old is %s?", name); 
     age = Integer.parseInt(JOptionPane.showInputDialog(message)); 
     message = String.format("How much gold does %s have?", name); 
     gold = Integer.parseInt(JOptionPane.showInputDialog(message)); 
    } 

    public String getStats() { 
     // String message = 
     return String.format("\nKnight Name: %s\nKnight Health: %d\nKnight Battles: %d\nKnight Age: %d\nKnight Gold: $%d\n\n", name, health, battles, age, gold); 
    } 

} 

Stars.java 수입 javax.swing.JOptionPane;

public class Stars { 
    private int rows, cols; 
    private String skyScape = new String(); 

    public Stars() { 
     rows = Integer.parseInt(JOptionPane.showInputDialog("How many rows of stars are there?")); 
     cols = Integer.parseInt(JOptionPane.showInputDialog("How many columns of stars are there?")); 
     for (int count = 0; count < rows; ++count) { 
      if ((count % 2) == 1) { 
       skyScape += " *"; 
      } else { 
       skyScape += "*"; 
      } 
      for (int colCount = 1; colCount < cols; ++colCount) { 
        skyScape += " *"; 
        if (colCount == cols - 1) { 
         skyScape += "\n"; 
        } 
      } 
     } 
    } 

    public int getRows() { 
     return rows; 
    } 

    public int getCols() { 
     return cols; 
    } 

    public String getSky() { 
     return skyScape; 
    } 
} 

도움이 될만한 의견이 있습니다.

답변

2

Java에서는 수퍼 클래스에 포함 된 데이터가 초기화되도록 모든 생성자 (객체를 제외하고)가 수퍼 클래스 생성자를 호출해야합니다. 수퍼 클래스 생성자를 명시 적으로 호출하지 않으면 컴파일러에서 수퍼 클래스의 기본 (인수가없는) 생성자에 대한 암시 적 호출을 삽입합니다.

+0

내가 원할 때까지 별이 초기화되는 것을 피할 수있는 방법이 있습니까? 별을 추가하면 newStar = new Stars(); 두 번 묻는 메시지가 표시됩니다. Knights 클래스가 초기화 될 때 한 번, 한 번 수행 할 때 한 번 가정합니다. 또는 변수 이름을 처음으로 초기화 할 수 있습니까? –

+1

생성자 대신에 setter 함수에 넣는 것만 큼 간단합니다. 초보자 실수! –

0

생성자가 기본 클래스 생성자를 호출합니다. 그렇지 않으면 기본 클래스의 멤버가 사용할 준비가되지 않습니다.

0

아무 문제가 없습니다. instantiate 하위 클래스 인 경우 수퍼 클래스 생성자 은 하위 클래스 생성자를 실행하기 전에을 호출해야합니다.

0

스타 클래스 Knight extends Stars을 확장 할 때 Stars 클래스도 Knight 클래스에로드되므로 생성자도 호출됩니다.

관련 문제