2011-04-14 8 views
0

저는 Java 초보자입니다. 나는 2 개의 질문이있다.
질문 1 : 생성자 호출을 통해 objDummy를 만들려고 할 때
세미콜론이없는 이유는 무엇입니까?
어떻게 init()에 대한 추가 호출이 가능합니까?Java에서 메소드 호출 구문

질문 2 : 왜 "생성자 종료"주석 줄에 세미콜론이 있습니까?
Java 구문의 일부입니까?

public abstract class A { 
    private static final A createDummy() { 
    // what is the meaning of the following syntax? Qn. 1 
    if (objDummy == null) { 
    objDummy = new A (null, null, null){ 
     final void init(String a, String b, Object[][] cArray) { 
     } 

     public final boolean isSend() { 
     return false; 
     } 
    // Question 2: format 
    }; //constructor ends 
    }//if ends 
    return objDummy; 
    } // function createDummy ends 
}//class ends 
+2

구조체를 더 잘 보이게하기 위해 소스를 다시 포맷하기 위해 자유를 사용했습니다 (공백 만 수정하고 다른 변경 사항은 없음). –

+0

@ Joachim : 감사합니다. 잘못된 서식에 대해 사과드립니다! 신속한 답변을 위해 모든 회원에게 감사드립니다 !! – Raiden

답변

2

표시되는 내용은 익명의 내부 클래스 선언입니다.

init() 메서드는 호출되지 않으며 재정의됩니다.

그것은 서면 같다 :

class Foo extends A { 

    /* some constructor declaration goes here */ 

    final void init(String a, String b, Object[][] cArray) {} 

    public final boolean isSend() { return false; } 
} 

그리고

objDummy = new Foo(null, null, null); 

그냥 둘 다 A의 서브 클래스를 정의하고 인스턴스화하는 하나의 표현으로 압축합니다. 구문이 왜 그런지에 대한 대답은 단순히이 방법으로 설계되었다는 것입니다. 표현이 의미하는 바를 생각할 때 그것은 또한 의미가 있습니다.

3

질문 1 : 생성자 호출을 통해 objDummy를 만들려고 할 때 세미콜론이없는 이유는 무엇입니까? 이

, 그것은 당신이 당신이 anonymous class (new A(null, null, null) {로 시작 비트가 당신이이 질문을 참조 };까지)가이 어떤 질문 2에서

에 대해 요구하고있는 하나입니다. 즉, 클래스를 생성하고, 생성자를 호출 한 다음 결과 인스턴스를 반환하는 것은 objDummy입니다.

어떻게 init()을 추가로 호출 할 수 있습니까?

init는이 익명 클래스에 정의되고있어,이 호출되지 않습니다. 구문은 처음에는 조금 혼란 스럽지만 일단 클래스를 정의한다는 것을 알게되면 명확 해집니다. 대략과 같이 재 작성 될 수 있었다

:

가 다시 말하지만, 그건
public abstract class A { 

    private static final A createDummy() { 
     if (objDummy == null) { 
      objDummy = new ASubclass(null, null, null); 
     } 
     return objDummy; 
    } 

    private static class ASubclass extends A { 
     final void init(String a, String b, Object[][] cArray) { 
     } 

     public final boolean isSend() { 
      return false; 
     } 
    } 
} 

하지 (그리고 컴파일,하지만 정확히 같은 원래의 코드와도; 누락 된 생성자가 있는데, 누락 된 선언은 objDummy입니다.)하지만 잘하면 분명히 알 수 있습니다. 자세한 내용은 링크를 참조하십시오.다음은 생성자에서 추측 버전 있도록이다 것이다 컴파일 :

public abstract class A { 

private static final A createDummy() { 
// what is the meaning of the following syntax? Qn. 1 
if (objDummy == null) { 
    objDummy = new B (null, null, null); //constructor ends 
}//if ends 
return objDummy; 
} // function createDummy ends 
}//class ends 

public class B extends A{ 
    final void init(String a, String b, Object[][] cArray) { 
    } 

    public final boolean isSend() { 
    return false; 
    } 
} 

그러나에서만 :

public abstract class A { 
    private static A objDummy; 

    A(String a, String b, Object[][] cArray) { 
    } 

    private static final A createDummy() { 
     if (objDummy == null) { 
      objDummy = new ASubclass(null, null, null); 
     } 
     return objDummy; 
    } 

    private static class ASubclass extends A { 
     ASubclass(String a, String b, Object[][] cArray) { 
      super(a, b, cArray); 
     } 

     final void init(String a, String b, Object[][] cArray) { 
     } 

     public final boolean isSend() { 
      return false; 
     } 
    } 
} 
1

당신 코드 A. 이것은와 동일 확장 익명의 내부 클래스를 정의 단, 익명의 내부 클래스에는 클래스 이름이 없으며 클래스의 포함 클래스에 대한 암시 적 참조가 있습니다. 이 참조는 "A.this"를 호출하여 사용할 수 있습니다.

게시 할 코드를 보면 콜론이 필요한 이유가 분명해질 것입니다. 기본적으로 익명 내부 클래스는 B 생성자의 마지막 대괄호와 그 뒤에 오는 세미콜론 사이에 선언됩니다.