2011-09-04 4 views
0

를 호출 :자바 : 나는 문제가 발생하여 자바 프로그램, 서브 클래스의 생성자는 슈퍼 클래스의 방법</p> <p>코드를 호출하여 오류를 던지고있다</p> <p>것은이 유사하다을 만드는 동안 상속 클래스 생성자는 슈퍼 클래스

class Manage 
{ 
    public static void main(String[] args) 
    { 
     Manager m1 = new Manager (35); 
    } 
} 

class Employee 
{ 
     int emp_id; 
     public Employee(int id) 
     { 
       this.emp_id = id; 
     } 
     public int get_id() 
     { 
       return emp_id; 
     } 

} 
class Manager extends Employee 
{ 
     public Manager(int id) 
     { 
       this.emp_id = id ; 
     } 
} 

class Engineer extends Employee 
{ 
     public Engineer(int id) 
     { 
       this.emp_id = id ; 
     } 
} 

그리고 오류는 다음과 같이이다 :

$ javac app.java 
app.java:25: cannot find symbol 
symbol : constructor Employee() 
location: class Employee 
     { 
     ^
app.java:33: cannot find symbol 
symbol : constructor Employee() 
location: class Employee 
     { 
     ^
2 errors 

왜 이런 일이 발생합니까?

답변

8

수퍼 클래스에는 기본 생성자가 없습니다. 그래서 당신은 슈퍼 클래스에 적절한 생성자 인수를 전달해야합니다

super(id); 

가 (모두 ManagerEngineer 생성자에서 상위 라인으로이를 넣습니다.) 또한 두 경우 모두 this.emp_id = id 라인을 제거해야합니다. 일반적으로

, 생성자는 super(...) 또는 this(...) 문으로 시작되지 않습니다 (당신이뿐만 아니라이 두 가지 중 하나를 가질 수있다) 경우 (인수없이) super()를 사용하는 다음 기본값으로 설정합니다.

3

인수를 사용하여 생성자를 지정 했으므로 Java는 인수가없는 기본 생성자를 제공하지 않습니다. 확장 클래스 생성자의 첫 번째 줄에 super(id)을 사용하여 사용자가 생성 한 생성자를 명시 적으로 호출하거나 생성자를 명시 적으로 호출해야합니다.

1

당신이 직원

class Employee { 

    private int emp_id; 

    public Employee() { 
    } 

    public Employee(int id) { 
      this.emp_id = id; 
    } 

    public int get_id() { 
      return emp_id; 
    } 

} 

에 기본 생성자 (인수)를 정의하지 않았기 때문에 오류가 생성되지만 고려해야 할 점 몇 가지가 있습니다 : 생성자를 통해 emp_id을 설정하는은과 정의 그것을 읽을 게터. 그 밭은 사적인 것이었다. 그렇지 않으면 직접 액세스 할 수 있습니다.

이미 동일한 클래스에서 동일한 생성자를 정의 할 필요없이 ID를 설정하는 Employee에 생성자가 있습니다. 수퍼 클래스의 생성자를 사용하면됩니다.

class Manager extends Employee { 

    public Manager(int id) { 
     super(id); // calls the superclass constructor 
    } 

} 

이 경우 기본 생성자가 필요하지 않습니다.

1

Java에서 하위 클래스 생성자는 항상 부모 클래스의 생성자 중 하나를 호출합니다. 이것은 클래스가 제대로 초기화 될 때 필요합니다. 서브 클래 싱 된 경우에도 필드와 상태가 설정되어 있어야하며 이것이 java에서 수행되는 방법입니다. 아무 것도 명시 적으로 지정되지 않으면 기본 no-arg 생성자를 호출합니다.