2011-09-08 4 views
31

노련한 Java 개발자는 간단 할 수 있지만 간단히 알 수는 없습니다. 나는 여기에서 게시물을 읽었다. 코드는클래스의 새 인스턴스를 만들 때 Java 재정의 메서드

View v = new View(this) { 
    @Override 
    protected void onDraw(Canvas canvas) { 
     System.out.println("large view on draw called"); 
     super.onDraw(canvas); 
    } 
}; 

Android 관련 질문이었습니다. 여기서 사용자는 뷰의 인스턴스를 생성하고 메소드를 한 줄로 오버라이드합니다. 이런 종류의 코딩에 대한 이름이 있습니까?

두 번째 의심은 다른 패키지의 보호 된 메소드보다 우선합니다. 보호 된 의미 패키지는 비공개가 아닙니다. 나는 그것이 밖으로 시도한대로 이것이 작동 할 것이라는 점을 그러나 나는 그것이 작동한지 왜 다만 이해할 수 없었다는 것을 알고있다. 그렇다면이 코드는 왜 작동합니까?

나는 이것을 묻기 전에 Google에 검색하려고했지만 답을 알아 내지 못했습니다.

답변

18

protected은 (대략) "하위 클래스에서 사용 가능"을 의미합니다. (this table을 참조하십시오.) new View(this) { ... }은 서브 클래스를 생성하기 때문에 서브 클래스를 정의하는 것이 가능합니다.

이 경우 다른 패키지에 있어도 상관 없습니다. this table에있는 protected 줄과 두 번째 열을 참조하십시오. 메서드가 하위 클래스에 있다는 사실은 보호 된 메서드에 "액세스"하기에 충분합니다.


잠재적 후속 질문 : 그것은 수 있도록 무엇을 의미, 만약 내가 방법을 어쨌든 호출 할 수 없습니다?

Java의 모든 메소드는 가상입니다. 즉, View 클래스가 onDraw 메서드로 겉으로보기에 내부 호출을 수행 할 때마다이 호출이 재정의 된 메서드에 전달됩니다.

+0

내가 좀 기본 액세스 및 보호 액세스에 대해 잊어 버렸습니다. 그러나 나는 익명의 수업을 알지 못했다. 감사. – blessenm

9

정확히 코딩 종류가 아닙니다. 이것은 Java 익명 클래스입니다. Android 및 일반적으로 이벤트 리스너와 그러한 종류의 항목에서 매우 일반적입니다.

자세한 내용은 당신은 this link (아마 최고의 하나를) 읽을 수 있습니다

익명 내부 클래스는 어떤 상황에서 매우 유용하다. 의 경우 예를 들어 클래스의 하위 클래스를 만들지 않고 개체를 인스턴스로 만들고 메서드 오버로드와 같은 추가 작업을 수행해야하는 경우를 고려해보십시오. 두 번째 질문에 대해

는 키워드 protected이 방법은 서브 클래스 만 사용할 수 있음을 의미하므로이 메소드를 오버라이드 (override) 할 수 있습니다.

+0

자바에서 익명의 클래스를 인식하지 못했습니다. 링크와 설명에 감사드립니다. +1 투표. – blessenm

3

이것은 익명의 클래스입니다. 당신은 당신이 보호 된 방법을 무시하고 이것이 완벽하다는 것은 맞습니다. 보호 된 메서드는 표시되며 여기에서 만든 하위 클래스에 의해 재정의 될 수 있습니다.

변수 또는 메서드에 대한 범위를 지정하지 않으면 패키지가 보호됩니다. 그것은 보호받는 것과 다릅니다.

1

익명 클래스라고하는 다른 사람들과 마찬가지로 이미 익명 클래스라고하며 보호 된 메서드는 자식 클래스 과 동일한 패키지에있는 클래스에서 볼 수 있으므로 재정의 된 메서드는 유효합니다.

1

이렇게 많은 응답자가 "protected"를 위해 존재했기 때문에 다른 사람에게 갈 것입니다.
@override는 컴파일러에게 기본 클래스 메소드를 대체하도록 알리고 있으며,이 서명의 기본 클래스 메소드가없는 경우 컴파일 오류가 발생합니다.

이러한 것을 주석이라고합니다. Java에서 주석 항목을 검색 할 수 있습니다. 사용자 정의 주석도 작성할 수 있습니다.

감사합니다,
SSuman185

관련 문제