2014-02-26 5 views
0

프로그램을 작성할 때 예기치 않은 결과가 발생합니다. 나는 3 개의 클래스를 가지고 있고 그것들은 모두 적절하게 컴파일되지만, 내가 runt 할 때 콘솔에 적절한 출력을 쓰는 것 같지 않습니다. 나는 ClassTest 클래스 생성자에 super()를 사용주된 수업이 너무 많습니까?

AbsClass called 
Extender called 
ClassTest called 

, 그러나 그것은 단지 부모를 호출해야합니다 :

Extender called 
ClassTest called 

그러나,이 쓰고 : 내 주요 방법을 바탕으로, 나는 결과를 보여주는를 얻어야한다 클래스 맞지?

public abstract class AbsClass { 
    public AbsClass() { 
     System.out.println("AbsClass called"); 
    }   
} 

여기에 두 번째 클래스의 :

가 여기에 첫 번째 클래스의

public class Extender extends AbsClass { 
    public Extender() { 
     System.out.println("Extender called"); 
    } 
} 

다음은 주요 방법 마지막 클래스의 :

public class ClassTest extends Extender { 
    public ClassTest() { 
     super(); 
     System.out.println("ClassTest called"); 
    } 

    public static void main(String[] args){ 
     ClassTest test = null; 
     test=new ClassTest(); 
    } 
} 
+2

_ "생성자가 명시 적으로 수퍼 클래스 생성자를 호출하지 않으면 Java 컴파일러는 수퍼 클래스의 인수없는 생성자에 대한 호출을 자동으로 삽입합니다."_ http://docs.oracle.com/javase/tutorial/java /IandI/super.html –

+0

기대되는 결과를 얻고 있습니다 .... 무엇이 잘못 되었나요? Java 컴파일 및 실행 방법을 알고 있습니까? –

+0

@Suzon 나는 컴파일하고 실행하는 방법을 알고 있지만, 내가 쓴 후자의 결과를 얻고있다. – liberation

답변

2

당신이 상속 한 경우 클래스, 생성자는 항상 모든 조상을 호출합니다.

super(parameters)으로 지정하지 않으면 기본적으로 super()이 호출됩니다.

ancestor에 매개 변수가있는 생성자가 있고 매개 변수가없는 생성자가 있고 해당 확장 클래스가 호출 할 생성자를 지정하지 않으면 코드가 호환되지 않습니다.

예 :

public abstract class AbsClass { 
    public AbsClass(String text) { 
     System.out.println("AbsClass called: " + text); 
    }   
} 

public class Extender extends AbsClass { 
    public Extender() { 
     System.out.println("Extender called"); 
    } 
} 

은 컴파일 가능한 있지 않습니다.

(중요한 것은 : 클래스는 생성자가없는 경우, 매개 변수를 사용하지 않는 암시 적으로 자동 생성 된 생성자가)

2

당신은 다음 this() 또는 super()에 명시 적으로 호출로 시작하지 않는 생성자가있는 경우 컴파일러는 자동으로 기본 수퍼 클래스 생성자에 대한 호출을 삽입합니다. Java Language Specification (§8.8.7)에서 : 명시 적 생성자 호출 및 선언 된 생성자로 시작하지 않는 생성자 몸이 원시 클래스 개체의 일부가 아닌 경우

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

이렇게 기본 생성자 AbsClass()Extender의 생성자가 실행을 시작할 때 호출됩니다.

관련 문제