2014-04-29 2 views
2

꽤 녹슬지 만 저는 이처럼 작성된 코드를 본 적이 없다고 확신합니다. 그것은 자바 연관 테스트에서 모의 ​​질문 누군가가 내게 정적 (정적) 라인 10에 go() 메서드에 연결되어 있는지 여부를 말해 줄 수 ?? 그리고 왜 출력은 x y c g입니까?여기서 정적 인 것은 Java에서 참조하는 것입니까

public class testclass { 

    testclass() { 
     System.out.print("c "); 
    } 

    { 
     System.out.print("y "); 
    } 

    public static void main(String[] args) { 
     new testclass().go(); 
    } 

    void go() { 
     System.out.print("g "); 
    } 

    static { 
     System.out.print("x "); 
    } 

} 
+1

가능한 중복 : http://stackoverflow.com/questions/2943556/static-block-in-java – user432

+0

'정적 {}'의 정적 초기화에 추가 수업. 클래스가 초기화 될 때 위에서 아래로 실행됩니다. –

+0

ahh .. 그 이유는 x는 처음 인쇄됩니다 .. 감사합니다. ya'll – Leonne

답변

0
static { System.out.print("x "); } 

정적 초기화 도구 블록입니다. 이것은 클래스 로딩 할 때 호출됩니다. 따라서 첫 번째 전화.

{ System.out.print("y "); } 

이것은 정적 이니셜 라이저 블록이 아닙니다.객체가 생성되면 제일 먼저 호출됩니다.

testclass() { System.out.print("c "); } 

이것은 생성자입니다. 모든 이니셜 라이저 블록이 실행 된 후에 개체 생성 과정에서 실행됩니다.

마지막으로,

void go() { System.out.print("g "); } 

일반 메소드 호출. 마지막으로 처형 될 것입니다.

자세한 내용을 참조하십시오 http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html

1

들여 쓰기가 어려운 코드입니다. 위 클래스에서, 당신은

  1. 생성자
  2. 클래스 블록
  3. 정적 블록
  4. 그리고라는 방법 go()

class testclass { 

/** 
* Constructor, which gets called for every new instance, after instance block 
*/ 
testclass() { 
     System.out.print("c "); 
} 

/** 
* This is instance block which gets called for every new instance of the class 
* 
*/ 
{ 
    System.out.print("y "); 
} 

public static void main(String[] args) { 
    new testclass().go(); 
} 

/** 
* any method 
*/ 
void go() { 
     System.out.print("g "); 
} 

/** 
* This is static block which is executed when the class gets loaded 
* for the first time 
*/ 
static { 
     System.out.print("x "); 
} 

} 
3

여부를 말해 l의 '정적' ine 10은 go() 메서드에 연결됩니까 ??

go 메소드와 관련이 없습니다. 정적 초기화 블록이라고합니다.

왜 출력이 x y c g입니까? 다음은

클래스 로딩 시간 자바

  1. 의 실행 순서이며, 정적 필드/초기화 블록이 실행된다. 객체 생성 시간에
  2. 는 JVM은 초기 값 (0, 거짓, NULL)
  3. 호출 객체의 생성자을 기본 필드 세트 (아직 생성자의 몸체를 실행하지 않는다)
  4. 호출하는 초기화 및 초기화 블록을 사용하여 수퍼
  5. 초기화 필드 생성자
  6. 생성자의 본문을 실행
+0

이 [질문]의 http (http : //stackoverflow.com/questions/13699075/calling-a-java-method-with-no-name) 중복으로 표시해야합니다. –

0

정적 블록은 클래스가로드 첫째 intialised됩니다. thats 이유는 당신이 O를 ​​/ P로

x as the first output 
0

정적 초기화 블록입니다. 그래서 당신이 그 클래스의 객체를 만들 때 그것은 생성자 이전에 정적 초기화 블록을 먼저 실행합니다.