2011-01-26 2 views
27
Java tutorial "Defining an Interface" Java tutorial "Defining an Interface"에서 다음과 같이 표시됩니다.

인터페이스가 public가 아니라고 지정하면 인터페이스와 동일한 패키지에 정의 된 클래스에서만 인터페이스에 액세스 할 수 있습니다.자바 튜토리얼은 패키지 개인 인터페이스를 가질 수 있다고 말합니다.

interface PPInterface { 
    void foo(); 
    void bar(); 
} 

class NewClass implements PPInterface { 
    void foo() {} 
    void bar() {} 
} 

NewClass에서 컴파일러 오류를 생성합니다. 왜냐하면 "더 약한 액세스 권한을 할당하려고 시도하고 있습니다. 공개했습니다. ' 따라서 문서가 잘못되었거나 잘못되었거나 문서를 잘못 해석 한 것입니까?

나는 인터페이스를 사용할 필요가 없다고 생각합니다.

답변

48

이 인터페이스 자체는 패키지 개인이 될 수있는 인터페이스입니다. 정의 된 패키지 내에서만 (이름으로) 사용할 수있는 인터페이스를 정의 할 수 있지만 모든 인터페이스 메소드와 마찬가지로 그 메소드는 public입니다. 클래스가 해당 인터페이스를 구현하는 경우 정의한 메소드는 public이어야합니다. 여기서 중요한 점은 인터페이스가 유형이며 패키지가 아닌 패키지 외부에서 볼 수 있다는 것입니다. 인터페이스에 정의 된 메소드를 사용하는 것이 인터페이스 자체를 사용하는 것과 같지 않기 때문에 문서가 올바르지 않습니다.

인터페이스 정의시 메소드가 모두 암시 적으로 public이므로 메소드 정의가 변경되지 않기 전에 public을 추가하지 마십시오.

인터페이스를 구현 한 클래스가 패키지 개인이면 인터페이스 메서드가 public 인 것은 분명히 문제가되지 않습니다. 단일 상속 문제가 당신의 방식대로되지 않는다면 물론 인터페이스 대신 추상 클래스를 사용할 수도 있습니다 :

abstract class Whatever { 
    abstract void foo(); 
    abstract void bar(); 
} 
+2

어, 다시 우리는 자바의 인터페이스 인 http : // stackoverflow의 접근 제한 제한으로 인해 추상적 클래스로 해킹을 강요 받고 있습니다.com/questions/5376970/protected-in-interfaces/5377300 # 5377300 – Pacerier

+0

"인터페이스 유형은 패키지가 아닌 패키지 외부에서 볼 수 있습니다." 어떻게 보이지 않는 Type의 public 메소드에 액세스 할 수 있습니까? 나는 아직도 공용 메소드의 목적이 개인 클래스 (또는 인터페이스)라는 패키지에 무엇인지 이해하지 못합니다. –

+0

@KorayTugay : 인터페이스 메소드는 실제 효과가 있는지 여부에 관계없이 항상 'public'입니다. 그러나 예를 들어, 일부 공용 인터페이스를 구현하거나 일부 공용 유형을 확장하는 패키지 개인 유형이있는 경우 공용 유형의 메소드를 대체하는 해당 클래스/인터페이스의'public' 메소드를 패키지 외부에서 사용할 수 있습니다. – ColinD

4

나는 약한 액세스 권한이 여기에 설명 NewClass에서 foo()bar() 방법을위한되고있는 것을 (나는 이것에 대해 잘못 될 수 있지만) 생각 . 모든 인터페이스 메소드는 암시 적으로 public이지만, NewClass에서는 패키지 전용으로 남겨 둡니다. 이는 public보다 약한 보증입니다. NewClass을 변경하면

class NewClass implements PPInterface{ 
    public void foo() {} 
    public void bar() {} 
} 

아마이 해결됩니다 읽을 수 있습니다.

+0

실제로 ...하지만 나는 그것을 고치고 싶지 않습니다. 나는 그들이 개인적으로 패키지되기를 바란다. 도트는 당신이 이것을 할 수 있다는 것을 분명히했기 때문에, 문서는 틀린가? 아니면 패키지의 객체 만 인터페이스를 구현할 수 있다는 것을 의미합니까? 그러나 메소드는 여전히 공용입니까? (그게 답이라고 생각합니다) – Pete

+3

@ Pete- 나는 여기에 두 개의 별개의 이슈가 있다고 생각합니다. 인터페이스 package-private을 그대로두면 인터페이스를 참조 할 수있는 클래스 만 동일한 패키지에 있어야합니다. 그러나 해당 인터페이스로 정의 된 메서드는 암시 적으로 public이므로 인터페이스를 구현하는 모든 클래스에는 private로 표시된 특정 함수가 있어야합니다. 아니요, 문서가 올바르지 않습니다. 두 가지 별도의 가시성 수준이 있습니다. – templatetypedef

관련 문제