2013-03-30 3 views
5

나는 항상 생성자는 상속되지 생각하지만,이 코드를 보면 :Java 생성자 상속?

class Parent { 

Parent() { 
    System.out.println("S1"); 
} 

} 
class Child extends Parent { 

Child(){ 

    System.out.println("S2"); 
} 


} 

public class Test5 { 
public static void main(String[] args) { 
    Child child = new Child(); 

} 
} 

//RESULT: 
//S1 
//S2 

그것은 아이가 생성자를 상속 것을 보여준다. 결과에 S1이있는 이유는 무엇입니까? 매개 변수없이 2 생성자를 생성하고 기본 생성자 (S2 만)가없는 자식 생성자 만 결과를 가질 수 있습니까?

답변

1

자바 문서는 말한다 :

A subclass inherits all the members (fields, methods, and nested classes) from its superclass. Constructors are not members, so they are not inherited by subclasses, but the constructor of the superclass can be invoked from the subclass.

당신은 어떤 타입의 생성자를 선언하지 않는 경우, 디폴트가 추가됩니다.

하위 클래스의 첫 번째 행에 다른 생성자를 호출하지 않으면 super()가 호출됩니다.

1

생성자가 상속되지 않습니다.

파생 클래스에는 상속 클래스 생성자가 상속되지 않습니다.

매개 변수없이 2 개의 생성자를 만들 수 있으며 기본 생성자가없는 결과에 대해서만 하위 생성자를 가질 수 있습니까?

아니요, Java에서는 모든 파생 클래스 생성자가 수퍼 클래스 생성자를 호출합니다. 추가하지 않으면 인수 생성자를 호출하지 않습니다.

public SuperClass() { 
    ... 
} 

public DerivedClass() { 
    //Compiler here call no argument constructor of Super class. 
} 
0

당신은 쓰기 : 그것은 아이가 생성자를 상속 것을 알 수

.

생성자를 상속 할 수 없습니다. 클래스는 상속 될 수 있으므로 자식은 생성자를 상속하지 않습니다. 아이는 부모 클래스를 상속받습니다. 부모는 Object 클래스를 상속합니다. Child 생성자를 호출하면 Child 생성자의 코드가 실행되기 전에 자동으로 Object 생성자가 호출 된 다음 Parent 생성자가 호출됩니다.

이 결과를 얻을 이유 : 당신이보고있는 생성자 체인라고한다 무엇 이건

S1 
S2 
13

합니다. 이제 생성자 체인이란 무엇입니까 :

생성자 연결은 상속을 통해 발생합니다. 하위 클래스 생성자 메서드의 첫 번째 작업은 해당 수퍼 클래스의 생성자 메서드를 호출하는 것입니다. 이렇게하면 하위 클래스 객체를 생성 할 때 상속 체인에서 위 클래스의 초기화와 함께 이 시작됩니다.

상속 체인에는 여러 개의 클래스가있을 수 있습니다. 의 모든 생성자 메서드는 상단의 클래스가 도달하여 초기화 될 때까지 체인을 호출합니다.그런 다음 아래의 각 클래스는 체인이 원래 하위 클래스로 되돌아 감에 따라 초기화 된 입니다. 이 과정은 생성자 체인이라고합니다. 프로그램에서 어떤 일이 일어나고 무엇을 (Source)

.

class Child extends Parent 
{ 
    Child() 
    { 
    super();//automatically inserted here in .class file of Child 
    System.out.println("S2"); 
    } 
} 

그리고 당신의 부모 클래스는 다음과 변환됩니다 : 당신이 당신의 프로그램을 컴파일 할 때, 당신의 Childjavac하여이 방법으로 컴파일

Parent() 
{ 
    super();//Constructor of Object class 
    System.out.println("S1"); 
} 

왜 출력으로 표시되어있어 그 :

S1 //output from constructor of super class Parent 
S2 //output from constructor of child Class Child 
0

생성자는 명시 적 생성자가 정의되어 있지 않으면 항상 수퍼 클래스 생성자를 호출합니다. Java Language Specification에서 : 명시 적 생성자 호출 및 선언 된 생성자로 시작하지 않는 생성자 몸이 원시 클래스 개체의 일부가 아닌 경우

, 다음 생성자 몸은 암시 적으로 (슈퍼 클래스 생성자 호출 "슈퍼 시작); ", 인수를 취하지 않는 직접 수퍼 클래스의 생성자 호출.