2012-06-16 2 views
5

나는 그들이 현재 클래스와 같은 이름을 가지고 있기 때문에overiding 생성자 교과서의 단원에서는 의미를

"기술적으로, 생성자를 오버라이드 (override) 할 수없는 요약 상태를 읽고있다 책의 텍스트를 만들 수 없습니다. 새로운 생성자 대신 생성 . 때 클래스의 constuc : ... "

사람들이 말할 때

내가 이해하지 못하는 부분이있다"; 상속되는이 시스템은 잘 작동 tor 메서드가 호출되면 모든 수퍼 클래스에 대해 동일한 서명이있는 생성자 메서드가 호출됩니다. 따라서 상속받은 클래스의 모든 부분에 초기화가 발생할 수 있습니다. "

동일한 서명 섹션은 이해할 수 없습니다 .... 모든 생성자가 동일한 서명을 가지고 있어야합니다. , 그리고 나서 하위 클래스 객체를 초기화 할 때 super 클래스가 각 하위 클래스에 대해 super (arg1, arg2)를 호출하지 않고 자동으로 호출됩니다 ....

+0

어떤 교과서입니까? – UmNyobe

+0

저는 21 일 동안 Sams Teach Yourself Java 2를 사용했습니다. 나중에 자바의 새로운 기능을 따라 잡을 것이다. 그러나 그들이 말하는 것은 이것입니까? –

+0

그럼 사실이 아니기 때문에 당신은 혼란 스러울 것입니다 ... – UmNyobe

답변

2

클래스의 생성자 메소드가 호출 될 때 모든 수퍼 클래스에 대해 동일한 서명을 가진 생성자 메소드가 호출됩니다. 따라서 상속 클래스의 모든 부분에 초기화가 발생할 수 있습니다.

잘못된 설명입니다. 첫째, 용어에 대한 설명 : 생성자는 메서드가 아니므로 "생성자 메서드"라는 용어는 의미가 없습니다.

수퍼 클래스 생성자가 호출되는 것은 사실이지만 동일한 서명을 가질 필요는 없습니다. 서브 클래스의 생성자는 슈퍼 클래스 생성자 호출 표현 등

class Student extends Person { 
    public Student(String name) { 
     super(name, Occupation.STUDENT); 
    } 
} 

호출에 인수 개수 및 유형과 일치하는 슈퍼 클래스 생성자로 시작합니다. 당신은 당신이 그 생성자에게 넘기는 인수를 완전히 자유롭게합니다.

하위 클래스 생성자가 수퍼 생성자 호출 식으로 시작하지 않으면 컴파일러에서 사용자를 위해 수퍼 클래스의 액세스 할 수있는 인수가없는 생성자에 대한 호출을 삽입하거나 해당 생성자가 없으면 컴파일 오류를 발생시킵니다.

의 Sams 당신은 자바 2가 최신 십년 것을 알고 지금

를 위해 21 일에 자신에게 자바 2를 가르쳐? 이 오래된 책은 쓸모없는 재료를 가르쳐 줄 것이며, 빨리 잊을 수있는 최상의 방법이 될 것입니다. 왜 더 현대적인 책을 사용하지 않겠습니까?

10

그건 그렇지 않습니다. 꽤 괜찮아. 수퍼 클래스의 생성자가 기본 생성자 (즉, 인수가없는 생성자) 인 경우에만 자동으로 호출됩니다.

슈퍼 클래스 s에는 기본 생성자가 없으므로 super(args..)을 사용하여 명시 적으로 생성자를 호출해야합니다. 예를 들어

,이 BearManPig의 생성자 Animal 이외의 다른 서명을 가지고 있다는 사실에도 불구하고 완벽하게 괜찮 :

이 때문에 자바가 인수 없음의 생성자 기본을 찾았다
public class Animal { 
    public Animal() { 
    } 
} 

public class BearManPig extends Animal { 
    public BearManPig(String string) { 
    } 
} 

.

이제 기본 생성자가 없으면 호출 할 항목을 명시해야합니다. 예를 들어,이 하지 작업을 수행합니다

// DOESN'T COMPILE 
public class Animal { 
    public Animal(String string) { 
    } 

    public Animal(String string0, String string1) { 
    } 
} 

public class BearManPig extends Animal { 
    // There is no default constructor, stupid Java can't figure out what to do 
    public BearManPig(String string) { 
    } 
} 

을하지만이 작업을 수행합니다

// does compile 
public class Animal { 
    public Animal(String string) { 
    } 

    public Animal(String string0, String string1) { 
    } 
} 

public class BearManPig extends Animal { 
    public BearManPig(String string) { 
    super(string); // I've told Java what to do 
    } 
} 
+0

Hmmm Thanks @Tim Pote, 그건 내가 생각했던 것인데, 나는이 부분을 읽고 나 혼란스러워했다. –

4

모든 슈퍼 클래스가 같은 생성자 서명을 가질 필요가 없습니다.
새 개체를 만들 때 Java는 생성자가 정의되지 않은 경우 수퍼 클래스의 매개 변수 생성자를 호출하지 않습니다. 다른 생성자를 정의하지 않으면 매개 변수 생성자가 Java에 의해 제공되지 않습니다.
다른 생성자를 정의하는 경우 자식 클래스 생성자에서 첫 번째 줄에서 호출해야합니다.
This 도움이 될 수 있습니다.