2016-06-12 3 views
0

을 호출하는 생성자 형 명령문은 내 자신의 코드에서 객체 인스턴스의 생성자와 비슷한 문을 발견했지만 실제로는 그렇지 않습니다. 나는 아래의 "Hi"프린트와 같은 진술의 샘플을 어디에서 가져 왔는가를 완전히 잊어 버렸지 만 아마 그렇지는 않지만 생성자와 같이 작동합니다. 테스트 세트는 다음에 "최고"를 넣어, 슈퍼 클래스를했을 경우자바에서 super

public class TestSet { 
    String hi="Hi"; 
    public TestSet(){ 
     System.out.println("Bye"); 
    } 
    { 
     System.out.println(hi); 
    } 

    public static void main(String s[]){ 
     new TestSet(); 
    } 
} 

실제로, "안녕"과 "안녕"aaaand를 출력 코드 코드의 "안녕"조각은 작동하지 않습니다. 그래서 무엇입니까? 나는 인터넷 검색을하려고했지만 쿼리를 공식화하는 것은 어렵다. 덕분에 !

+0

안녕하세요 .-) –

+0

@StephanBijzitter no. 그렇지 않습니다. –

+0

NO! –

답변

2

"Hi"를 인쇄하는 문은 인스턴스 초기화 프로그램 블록에 있습니다. 이 블록은 클래스의 각 생성자 시작 부분에 복사되고 생성자 본문보다 먼저 실행되지만 수퍼 클래스 생성자가 실행 된 후에 실행됩니다. 따라서 new TestSet();Hi 다음에 Bye을 인쇄하지만 인스턴스 초기화 프로그램 블록에 대한 수퍼 클래스 생성자 (super())에 대한 호출을 추가 할 수 없습니다.

+0

예를 들어 내 생성자에서 "super"를 호출하는 경우 인스턴스 블록을 호출하기 전에 이전에 super constrctor가 호출 된 것처럼 혼란 스럽습니다. 이 문을 명명 해 주셔서 감사합니다 :) –

+0

상위 클래스를 추가하려고했습니다. 설명 된대로 정확히 작동합니다. –

+1

상위 클래스 생성자는 항상 모든 생성자에서 (명시 적으로 또는 묵시적으로) 호출됩니다 (단, 생성자가 다른 생성자를 호출하지 않는 한). 'this()'를 사용하여) 인스턴스 initializer 블록의 코드 앞에 호출된다. 인스턴스 이니셜 라이저 블록의 코드는 생성자의 본문 전에 호출됩니다 (수퍼 클래스 생성자에 대한 호출을 포함하지 않음). – Eran