2016-09-01 3 views
-1

저는 자체 학습 Java이고 상속에 대한 내 교과서의 일부 문제를 해결하기 위해 노력하고 있습니다. 문제는 기본적으로 수퍼 클래스 Person을 만들고 두 개의 클래스 studentinstructor을 추가하는 것입니다. 여기에서 학생에게는 전공이 있고 강사에게는 월급이 있습니다. 어쨌든 여기하위 클래스 슈퍼 생성자 내에서 부모 메서드 호출

내가 가진 무엇

모든 학생의 이름과 생년월일을 가지고 있기 때문에 지금까지

public class Person { 
    private String name; 
    private String date; 
    public Person(String name, String date) 
    { 
     this.name = name; 
     this.date = date; 
    } 
    public String getName() 
    { 
     return name; 
    } 
    public String getDate() 
    { 
     return date; 
    } 
    public String toString() 
    { 
     return "The name of the person is :" + getName() + " And this person was born in " + getDate(); 
    } 
} 

Student.java

public class Student extends Person { 

    private String major; 

    public Student(String major) 
    { 
     super(super.getName(),super.getDate()); // ERROR 
     this.major = major; 
    } 
} 

내 생각의 과정, 슈퍼 생성자를 호출하면를 반환하는 메서드를 전달할 수 있습니다. 제 원래 수퍼 클래스에있는의 이름입니다. 물론, 당신이이 난 그냥 방법 .getName().getDate()는, i '를 호출하여 생성자 Student에 두 개의 추가 변수를 만들고 저장 한 것이라고 생각 단지

public Student(String name, String birthDate, String major) 
{ 
      super(name,birthDate); 
      this.major = major; 
} 

을하는 것입니다 솔루션을 작동하지 않습니다 알 수 있습니다 이 장을 다시 읽지 만 문제점이 어디에 있는지 정말 이해하지 못합니다.

TLDR 무슨

super(super.getName(),super.getDate()); 

매우

+1

'슈퍼 (슈퍼.getName(), super.getDate());', 어떤 값이 슈퍼 생성자 ('Person')에 실제로 전달 될 것인가? –

+0

'Person'마다 이름과 생년월일이 있기 때문에 학생의 기본 정보로 전달되지 않습니까? 거기에서 나는'학생 '의'주요'을 조작 할 수있는 방법을 가질 수있다. – bill

+0

그들은 이름과 생년월일이 있는가 _yet_? 현재 예제를 취해 봅시다.'getName()'은 무엇을 반환할까요? –

답변

1

클래스는 객체를 생성 할 것입니다 방법에 대한 청사진처럼 주셔서 감사합니다 라인 문제.

귀하의 경우에는 Person을 기본 클래스로 사용하고 Student을 상속받은 Person의 두 클래스가 있습니다. 당신이 super() 생성자를 호출 할 때까지

생성자 방법을 통해 Student 클래스에서 개체를 만들려고 할 때, 컴파일러가 먼저 가서 Person 객체를 구축하지만,이 단계에서 점에 유의한다는 기본 클래스 Person 아직 구축되지 .

컴파일러는 부모 객체 (즉, 객체)가 제대로 작동하지 않기 때문에 컴파일러가이 작업을 수행하지 못하기 때문에 "아직 작성하지 않은 baseclass (Person)"메서드를 사용하고 싶습니다. super 키워드에서 액세스 가능)은 아직 없습니다 super()(반송 완료)까지. 그러므로 부모 클래스를하는 것. 상위가 빌드되기 전에 getName() 메소드가 유효하지 않습니다.

많은 사람들이 말하는 것과 마찬가지로 super.getName() 메서드를 사용할 수 있더라도 기본값이 설정되어 있지 않으므로 아무 값도 지정되지 않습니다.

호프가 더 도움이되기를 바랍니다.

+0

'죽지도'실패하지도 않습니다. 그러나 수퍼 클래스의 변수에 예기치 않은 값을 줄 수 있습니다. – EJP

+0

컴파일러가 처음부터 빌드되지 않기 때문에 @EJP는 쓰레기 값을 제공하지 않습니다. 이것은 C++가 아닙니다. 나는 Java8로 나의 사실을 확인했다. 시도 해봐. –

+0

'학생'은 '이름'또는 '생년월일'이 무엇인지 알 수 없지만 내 코드가 오류를 나타내는 이유는 무엇입니까? 아니면'super()'가 호출 될 때까지 아무 것도 응답이 없다는 것을 말하는지? – bill

0

생성자에서 super의 메소드를 참조 할 수 없습니다. 슈퍼 객체는 하위 클래스의 생성자를 실행하는 순간에는 아무 것도 아닙니다 (null).

관련 문제