문제

Java 에서는 거기에 명확한 규칙을 사용할 경우에 서의 접근 수정,즉 기본(패키지 개인), public, protectedprivate, 하면서, classinterface 을 다루는 상속?

도움이 되었습니까?

해결책

공식 튜토리얼 당신에게 약간의 사용 일 수 있습니다.

            │ Class │ Package │ Subclass │ Subclass │ World
            │       │         │(same pkg)│(diff pkg)│ 
────────────┼───────┼─────────┼──────────┼──────────┼────────
public      │   +   │    +    │    +     │     +    │   +     
────────────┼───────┼─────────┼──────────┼──────────┼────────
protected   │   +   │    +    │    +     │     +    │         
────────────┼───────┼─────────┼──────────┼──────────┼────────
no modifier │   +   │    +    │    +     │          │    
────────────┼───────┼─────────┼──────────┼──────────┼────────
private     │   +   │         │          │          │    

 + : accessible         blank : not accessible

다른 팁

(주의:나는 Java 프로그래머,나는 Perl 프로그래머입니다.Perl 는 공식적인 보호하는 것은 아마도 내가 왜 문제를 이해하므로 잘:))

Private

당신처럼 생각하는 것만 클래스 에는 그 선언은 그것을 볼 수 있습니다.

개인 패키지

만 볼 수 있고 사용 패키지 는 그것을 선언했다.이에 기본적으로 자바(일부로 볼 실수).

패키지 개인+으로 볼 수있는 하위 또는 패키지로 회원입니다.

공개

모든 사람은 그것을 볼 수 있습니다.

게시

외부에 표시되기를 제어합니다.(지 않는 동안 자바 구문,중요한 것은이 토론).

C++정의하는 추가적인 수준"이라고"친구와 더 적은 당신에 대해 알고 있는 더 나은입니다.

을 사용해야 하는 무엇인가?전체적인 아이디어는 캡슐에 넣기 숨기는 정보입니다.가능한 한 많은 숨기려의 세부 사항을 어떻게 무언가가 수행에 사용자에게 있습니다.왜?기 때문에 그 변경할 수 있습니다 나중에 그들을 깨지 않고 다른 사람의 코드입니다.이것을 최적화할 수 있습,리팩터링 설계하고 버그를 수정하지 않고 걱정하는 누군가 사용하는 코드로 당신은 철저하게됩니다.

그래서 엄지손가락의 규칙을 만드는 것만으로 볼 수 있으로 그들은 해야 합니다.시작과 함께 개인 및만 더 추가시성으로 필요합니다.만 공개하는 것이 절대적으로 필요한 사용자가를 알고,당신은 모든 세부 공통의 능력을 재설계 시스템입니다.

하려면 사용자가 사용자 정의 할 수 있는 행동,하기보다는 내부 공용할 수 있도록 재정을,그것은 종종 더 나은 아이디어를 밀어 그 용기로는 개체는 인터페이스를 공개한다.는 방법들은 단순히 플러그에서 새로운 객체입니다.예를 들어,만약 당신이 작성한 CD 플레이어 및 원"이동에 대한 정보를 찾을 수 있 이 CD"비트,사용자 정의보다는 만드는 사람들 방법을 공개할 모든 기능으로 자신의 개체고 당신의 개체 get/set 공개한다.이 방법은 인색에 대한 노출 당신의 용기를 권장 좋은 성분과 분리의 문제

개인적으로,나는 그냥"개인"및"public".많은 OO 언어 있습니다."보호"편리할 수 있지만,그것은 정말 속임수.면 인터페이스가 더 이상인 그 밖의 당신의 통제하고 당신이 찾아서 다른 사람의 코드를 찾을 사용합니다.

이것은 아이디어의"게시"에서 온다.변화하는 인터페이스(refactoring)그것이 필요합을 찾을 수 있는 모든 코드를 사용하는 응용 프로그램을 보여주는 좋은 그것도 있습니다.는 경우 인터페이스 프라이빗 아니라,문제입니다.면 그것의 보호 당신이 가야 할 모든 당신의 하위 클래스.의 경우 공 당신은 모든 코드를 사용하는 코드입니다.때로는 이러한 작업하는 경우에 회사는 코드의 내부 사용을 위해서만 그것이 문제가되지 않은 경우 인터페이스가 공개한다.당신이 잡을 수 있는 모든 코드의 기업입니다.하지만 경우에는 인터페이스는"출판",가 있다면 코드를 사용하여 외부로 귀하의 제어,당신은 거에요.당신이 지원해야 하는 인터페이스 또는 위험을 깨는 코드입니다.도 보호 인터페이스를 고려 될 수있 출판(는 이유는 나는 귀찮게 하지 않으로 보호되는).

많은 언어를 찾을 계층적 성격의 공공/보호/개인하는 것이 너무 제한되지와 라인에서 현실이다.그는 거기서 끝나의 개념이 특성 클래스, 지만,그것은 또 다른 쇼입니다.

다음은 테이블의 더 나은 버전입니다. (모듈에 대한 열이있는 미래 증거.)

Java Access Modifiers

설명

  • 사적인 회원 (회원i) 이다 선언 된 것과 동일한 클래스 내에서 액세스 할 수 있습니다.

  • 회원 액세스 수정자가 없습니다 (j)는 동일한 패키지의 클래스 내에서만 액세스 할 수 있습니다.

  • 보호 회원 (회원k) 동일한 패키지의 모든 클래스 내에서 액세스 할 수 있습니다. 그리고 다른 패키지의 서브 클래스 내에서.

  • 공공의 회원 (회원l) 모든 클래스에 액세스 할 수 있습니다 ( 기준 치수 그것은 선언 된 패키지를 내보내지 않습니다).


어떤 수정자를 선택해야합니까?

Access Modifiers(*). 회원이 클래스, 패키지, 클래스 계층 구조 또는 내부의 내부에 있거나 내부적으로 내부에 있지 않은지 스스로에게 물어보고 그에 따라 액세스 레벨을 선택하십시오.

예 :

  • 필드 long internalCounter 변이 가능하고 구현 세부 사항이므로 비공개 일 것입니다.
  • 공장 클래스 (동일한 패키지)에서만 인스턴스화 해야하는 클래스에는 패키지 외부에서 직접 호출 할 수 없기 때문에 패키지 제한 생성자가 있어야합니다.
  • 내부 void beforeRender() 렌더링 직전에 호출되고 서브 클래스의 후크로 사용되는 방법을 보호해야합니다.
  • void saveGame(File dst) GUI 코드에서 호출되는 메소드는 공개되어야합니다.

(*) 정확히 캡슐화는 무엇입니까?

                | highest precedence <---------> lowest precedence
*———————————————+———————————————+———————————+———————————————+———————
 \ xCanBeSeenBy | this          | any class | this subclass | any
  \__________   | class         | in same   | in another    | class
             \  | nonsubbed     | package   | package       |    
Modifier of x \ |               |           |               |       
————————————————*———————————————+———————————+———————————————+———————
public          |       ✔       |     ✔     |       ✔       |   ✔   
————————————————+———————————————+———————————+———————————————+———————
protected       |       ✔       |     ✔     |       ✔       |   ✘   
————————————————+———————————————+———————————+———————————————+———————
package-private |               |           |               |
(no modifier)   |       ✔       |     ✔     |       ✘       |   ✘   
————————————————+———————————————+———————————+———————————————+———————
private         |       ✔       |     ✘     |       ✘       |   ✘    

쉬운 규칙. 모든 것을 비공개로 선언하는 것으로 시작하십시오. 그런 다음 요구가 발생하고 설계가 보증함에 따라 대중을 향해 발전합니다.

회원을 노출시킬 때 대표 선택 또는 추상화 선택을 노출시키는 지 스스로에게 물어보십시오. 첫 번째는 관찰 가능한 행동보다는 실제 표현에 너무 많은 의존성을 소개하기 때문에 피하고 싶은 것입니다.

일반적인 규칙으로서 나는 서브 클래싱을 통해 방법 구현을 무시하지 않으려 고 노력한다. 논리를 망치는 것은 너무 쉽습니다. 당신이 그것을 무시하려는 경우 초록 보호 방법을 선언하십시오.

또한 재정의 할 때 @override 주석을 사용하여 리팩터를 리팩터링 할 때 물건이 깨지지 않도록하십시오.

실제로 간단한 그리드 쇼보다 조금 더 복잡합니다. 그리드는 액세스가 허용되는지 여부를 알려주하지만 정확히 액세스를 구성하는 것은 무엇입니까? 또한 액세스 레벨은 중첩 클래스 및 상속을 복잡한 방식으로 상호 작용합니다.

"기본"액세스 (키워드 부재에 의해 지정됨)도 호출됩니다. 패키지-민간. 예외 : 인터페이스에서 수정자는 공개 액세스를 의미하지 않습니다. 대중 이외의 수정자는 금지되어 있습니다. 열기 상수는 항상 공개됩니다.

요약

이 액세스 지정자가 허용되는 멤버에 대한 액세스입니까?

  • 회원입니다 private: 멤버가 호출 코드와 동일한 클래스 내에서 정의 된 경우에만 가능합니다.
  • 회원은 패키지 개인입니다. 호출 코드가 멤버의 즉시 동봉 된 패키지 내에있는 경우에만 가능합니다.
  • 회원입니다 protected: 동일한 패키지 또는 멤버가 호출 코드를 포함하는 클래스의 슈퍼 클래스로 정의 된 경우.
  • 회원입니다 public: 예.

액세스 지정자에 적용되는 것

로컬 변수 및 공식 매개 변수는 액세스 지정자를 가져갈 수 없습니다. 범위 규칙에 따라 본질적으로 외부에 접근 할 수 없기 때문에 효과적으로 비공개입니다.

최상위 범위의 클래스의 경우에만 public 패키지-프라이버시가 허용됩니다. 이 디자인 선택은 아마도 그 때문일 것입니다 protected 그리고 private 패키지 레벨에서 중복됩니다 (패키지 상속이 없습니다).

모든 액세스 지정자는 클래스 멤버 (생성자, 방법 및 정적 멤버 기능, 중첩 클래스)에서 가능합니다.

관련된: Java 클래스 접근성

주문하다

액세스 지정자를 엄격하게 주문할 수 있습니다

공개> 보호 된> 패키지-프라이버시> 개인

의미가 있습니다 public 가장 많은 액세스를 제공하고 private 최소한. 개인 회원에 대한 참조도 패키지-프라이버시 멤버에게도 유효합니다. 패키지-민간 회원에 대한 모든 참조는 보호 된 멤버 등에서 유효합니다. (같은 패키지에서 보호 된 회원에게 다른 수업에 접근 할 수있는 것은 실수로 간주되었습니다.)

메모

  • 수업의 방법 ~이다 같은 클래스의 다른 개체의 개인 구성원에 액세스 할 수 있습니다. 보다 정확하게, 클래스 C 방법은 C의 서브 클래스의 객체에서 C의 개인 멤버에 액세스 할 수 있습니다. (스칼라와 비교하여 사용을 지원합니다. private[this].)
  • 객체를 구성하려면 생성자에 액세스해야합니다. 따라서 모든 생성자가 비공개 인 경우 클래스는 클래스 내에 거주하는 코드 (일반적으로 정적 공장 메소드 또는 정적 변수 초기화기)에 의해서만 구성 될 수 있습니다. 유사하게 패키지-프라이버시 또는 보호 된 생성자와 유사하게.
    • 개인 생성자 만 있으면 Java는 서브 클래스의 생성자가 슈퍼 클래스 생성자를 암시 적으로 또는 명시 적으로 호출해야하기 때문에 클래스가 외부에서 서브 클래스를 사용할 수 없음을 의미합니다. (그러나 서브 클래스를하는 중첩 클래스가 포함될 수 있습니다.)

내부 수업

당신은 또한 고려해야합니다 중첩 내부 클래스와 같은 스코프. 복잡성의 예는 내부 클래스에 구성원이 있으며, 이는 자체적으로 액세스 수정자를 수용 할 수 있다는 것입니다. 따라서 공개 회원과 함께 개인 내부 클래스를 가질 수 있습니다. 회원에게 액세스 할 수 있습니까? (아래 참조) 일반적인 규칙은 범위를보고 재귀 적으로 생각하여 각 레벨에 액세스 할 수 있는지 확인하는 것입니다.

그러나 이것은 매우 복잡하고 자세한 내용은 Java 언어 사양을 참조하십시오. (예, 과거에는 컴파일러 버그가있었습니다.)

이러한 상호 작용을 맛 보려면이 예를 고려하십시오. 개인 내부 클래스를 "누출"할 수 있습니다. 이것은 일반적으로 경고입니다.

class Test {
    public static void main(final String ... args) {
        System.out.println(Example.leakPrivateClass()); // OK
        Example.leakPrivateClass().secretMethod(); // error
    }
}

class Example {
    private static class NestedClass {
        public void secretMethod() {
            System.out.println("Hello");
        }
    }
    public static NestedClass leakPrivateClass() {
        return new NestedClass();
    }
}

컴파일러 출력 :

Test.java:4: secretMethod() in Example.NestedClass is defined in an inaccessible class or interface
        Example.leakPrivateClass().secretMethod(); // error
                                  ^
1 error

몇 가지 관련 질문 :

경험상 :

  • private: 클래스 범위.
  • default (또는 package-private) : 패키지 범위.
  • protected: package scope + child (패키지와 같이 다른 패키지에서 서브 클래스를 할 수 있습니다). 보호 된 수정자는 항상 "부모-자식"관계를 유지합니다.
  • public: 모든 곳.

결과적으로 액세스를 세 가지 권리로 나누면 다음과 같습니다.

  • (직접 (같은 클래스 내 또는 "이"구문을 통해 메소드에서 호출).
  • (참조 (클래스에 대한 참조 또는 "dot"구문을 통해 메소드를 호출).
  • (계승 (서브 클래스를 통해).

그런 다음이 간단한 테이블이 있습니다.

+—-———————————————+————————————+———————————+
|                 |    Same    | Different |
|                 |   Package  | Packages  |
+—————————————————+————————————+———————————+
| private         |   D        |           |
+—————————————————+————————————+———————————+
| package-private |            |           |
| (no modifier)   |   D R I    |           |
+—————————————————+————————————+———————————+
| protected       |   D R I    |       I   |
+—————————————————+————————————+———————————+
| public          |   D R I    |    R  I   |
+—————————————————+————————————+———————————+

아주 짧게

  • public: 모든 곳에서 접근 할 수 있습니다.
  • protected: 동일한 패키지의 클래스와 모든 패키지에있는 서브 클래스가 액세스 할 수 있습니다.
  • 기본값 (수정자가 지정되지 않음) : 동일한 패키지의 클래스에서 액세스 할 수 있습니다.
  • private: 동일한 클래스 내에서만 액세스 할 수 있습니다.

Java에서 가장 오해 된 액세스 수정자는 IS입니다 protected. 서브 클래스가 볼 수있는 한 가지 예외가있는 기본 수정 자와 유사하다는 것을 알고 있습니다. 하지만 어떻게? 다음은 혼란을 분명히하는 예입니다.

  • 2 개의 수업이 있다고 가정합니다. Father 그리고 Son, 각각 자체 패키지로 :

    package fatherpackage;
    
    public class Father
    {
    
    }
    
    -------------------------------------------
    
    package sonpackage;
    
    public class Son extends Father
    {
    
    }
    
  • 보호 방법을 추가합시다 foo() 에게 Father.

    package fatherpackage;
    
    public class Father
    {
        protected void foo(){}
    }
    
  • 방법 foo() 4 가지 맥락에서 호출 할 수 있습니다.

    1. 동일한 패키지에있는 클래스 내부에서 foo() 정의됩니다 (fatherpackage):

      package fatherpackage;
      
      public class SomeClass
      {
          public void someMethod(Father f, Son s)
          {
              f.foo();
              s.foo();
          }
      }
      
    2. 서브 클래스 내부, 현재 인스턴스를 통해 this 또는 super:

      package sonpackage;
      
      public class Son extends Father
      {
          public void sonMethod()
          {
              this.foo();
              super.foo();
          }
      }
      
    3. 유형이 동일한 클래스 인 참조에서 :

      package fatherpackage;
      
      public class Father
      {
          public void fatherMethod(Father f)
          {
              f.foo(); // valid even if foo() is private
          }
      }
      
      -------------------------------------------
      
      package sonpackage;
      
      public class Son extends Father
      {
          public void sonMethod(Son s)
          {
              s.foo();
          }
      }
      
    4. 참조 유형은 부모 클래스이며 내부에 패키지 어디에 foo() 정의됩니다 (fatherpackage) [이것은 컨텍스트 번호 안에 포함될 수 있습니다. 1]:

      package fatherpackage;
      
      public class Son extends Father
      {
          public void sonMethod(Father f)
          {
              f.foo();
          }
      }
      
  • 다음 상황은 유효하지 않습니다.

    1. 참조 유형은 부모 클래스이며 밖의 패키지 어디에 foo() 정의됩니다 (fatherpackage):

      package sonpackage;
      
      public class Son extends Father
      {
          public void sonMethod(Father f)
          {
              f.foo(); // compilation error
          }
      }
      
    2. 서브 클래스 패키지 내부의 비 공급 (하위 클래스는 보호 된 구성원을 부모로부터 상속하고 비 클래스에서 비 개인품으로 만듭니다) :

      package sonpackage;
      
      public class SomeClass
      {
          public void someMethod(Son s) throws Exception
          {
              s.foo(); // compilation error
          }
      }
      

사적인

  • 방법, 변수 및 생성자

개인으로 선언 된 방법, 변수 및 생성자는 선언 된 클래스 자체 내에서만 액세스 할 수 있습니다.

  • 클래스 및 인터페이스

개인 액세스 수정자는 가장 제한적인 액세스 수준입니다. 클래스와 인터페이스는 비공개 일 수 없습니다.

메모

공개 getter 방법이 클래스에 존재하는 경우 개인으로 선언 된 변수는 클래스 밖에서 액세스 할 수 있습니다. 슈퍼 클래스로 보호 된 변수, 방법 및 생성자는 다른 패키지의 서브 클래스 또는 보호 된 멤버 클래스의 패키지 내의 클래스에서만 액세스 할 수 있습니다.


보호

  • 클래스 및 인터페이스

보호 된 액세스 수정자는 클래스 및 인터페이스에 적용 할 수 없습니다.

방법, 필드는 보호로 선언 할 수 있지만 인터페이스의 방법과 필드는 보호 될 수 없습니다.

메모

보호 된 액세스는 서브 클래스에 도우미 방법이나 변수를 사용할 수있는 기회를 제공하면서 관련이없는 클래스가 사용하지 않도록합니다.


공공의

클래스, 메소드, 생성자, 인터페이스 등 선언 대중은 다른 클래스에서 액세스 할 수 있습니다.

따라서 공개 클래스 내부에서 선언 된 필드, 방법, 블록은 Java Universe에 속한 모든 클래스에서 액세스 할 수 있습니다.

  • 다른 패키지

그러나 우리가 액세스하려는 공개 클래스가 다른 패키지에있는 경우 공개 클래스를 여전히 가져와야합니다.

클래스 상속으로 인해 클래스의 모든 공개 방법과 변수는 서브 클래스에 의해 상속됩니다.


기본 -NO 키워드 :

기본 액세스 수정자는 클래스, 필드, 메소드 등에 대한 액세스 수정자를 명시 적으로 선언하지 않음을 의미합니다.

  • 같은 패키지 내에서

액세스 제어 수정자가없는 변수 또는 메소드는 동일한 패키지의 다른 클래스에서 사용할 수 있습니다. 인터페이스의 필드는 암시 적으로 공개 정적 최종이며 인터페이스의 메소드는 기본적으로 공개됩니다.

메모

정적 필드를 무시할 수는 없습니다. 오류가 표시되지 않지만 우리가 제외하고는 작동하지 않습니다.

관련 답변

참조 링크

http://docs.oracle.com/javase/tutorial/java/javaoo/accesscontrol.html http://www.tutorialspoint.com/java/java_access_modifiers.htm

사적인: 수업에만 제한된 액세스

기본값 (수정 자 없음): 클래스 및 패키지에 대한 액세스가 제한되어 있습니다

보호: 클래스, 패키지 및 서브 클래스에 대한 제한된 액세스 (내부 및 외부 패키지 모두)

공공의: 클래스, 패키지 (모두) 및 서브 클래스에 액세스 할 수 있습니다.

차이점은 이미 제공된 링크에서 찾을 수 있지만 일반적으로 사용하는 링크는 일반적으로 "최소 지식의 원칙"으로 이어집니다. 필요한 가시성 만 허용합니다.

액세스 수정자는 여러 레벨에서 액세스를 제한 할 수 있습니다.

공공의: 기본적으로 동일한 패키지에 있든 없든 클래스에서 액세스 할 수있는만큼 간단합니다.

동일한 패키지에 있으면 액세스하려면 직접 액세스 할 수 있지만 다른 패키지에있는 경우 클래스의 객체를 만들 수 있습니다.

기본: 패키지 클래스의 모든 패키지에서 동일한 패키지로 액세스 할 수 있습니다.

액세스하려면 클래스의 객체를 만들 수 있습니다. 그러나 패키지 외부 에서이 변수에 액세스 할 수 없습니다.

보호 : 다른 패키지의 서브 클래스뿐만 아니라 동일한 패키지로 변수에 액세스 할 수 있습니다. 기본적으로 그것은입니다 기본 + 상속 행동.

기본 클래스에 정의 된 보호 필드에 액세스하려면 아동 클래스의 객체를 만들 수 있습니다.

사적인: 같은 클래스에서 액세스 할 수 있습니다.

비 정적 메소드에서는 직접 액세스 할 수 있습니다 이것 참조 (생성자)이지만 정적 메소드에서 액세스하려면 클래스의 객체를 만들어야합니다.

Java의 액세스 수정 자.

Java Access Modifiers는 Java에서 액세스 제어를 제공하는 데 사용됩니다.

1. 기본값 :

동일한 패키지로만 클래스에 액세스 할 수 있습니다.

예를 들어,

// Saved in file A.java
package pack;

class A{
  void msg(){System.out.println("Hello");}
}

// Saved in file B.java
package mypack;
import pack.*;

class B{
  public static void main(String args[]){
   A obj = new A(); // Compile Time Error
   obj.msg(); // Compile Time Error
  }
}

이 액세스는 공개 및 보호보다 더 제한되지만 개인보다 덜 제한됩니다.

2. 공개

어디서나 액세스 할 수 있습니다. (글로벌 액세스)

예를 들어,

// Saved in file A.java

package pack;
public class A{
  public void msg(){System.out.println("Hello");}
}

// Saved in file B.java

package mypack;
import pack.*;

class B{
  public static void main(String args[]){
    A obj = new A();
    obj.msg();
  }
}

출력 : 안녕하세요

3. 개인

같은 클래스 내에서만 액세스 할 수 있습니다.

한 클래스에서 개인 멤버에 개인 회원에 액세스하려고하면 컴파일 오류가 발생합니다. 예를 들어,

class A{
  private int data = 40;
  private void msg(){System.out.println("Hello java");}
}

public class Simple{
  public static void main(String args[]){
    A obj = new A();
    System.out.println(obj.data); // Compile Time Error
    obj.msg(); // Compile Time Error
  }
}

4. 보호

동일한 패키지의 클래스와 서브 클래스에만 액세스 할 수 있습니다.

예를 들어,

// Saved in file A.java
package pack;
public class A{
  protected void msg(){System.out.println("Hello");}
}

// Saved in file B.java
package mypack;
import pack.*;

class B extends A{
  public static void main(String args[]){
    B obj = new B();
    obj.msg();
  }
}

출력 : 안녕하세요

Enter image description here

이 페이지의 대부분의 답변을 포함하여 매우 일반적으로 잘못된 세부 사항을 다루고 싶습니다. "기본"액세스 (액세스 수정자가 존재하지 않는 경우)는 항상 패키지-프라이버시와 동일하지 않습니다.. 그것은 무엇이 무엇인지에 달려 있습니다.

  • 비회원 유형 (즉, 클래스, 열거, 인터페이스 및 다른 유형 내부에서 선언되지 않은 주석 유형)은 기본적으로 패키지-프라이버시입니다. (JLS §6.6.1)

  • 클래스 멤버 및 생성자는 기본적으로 패키지-민간입니다. (JLS §6.6.1)

  • 열거적인 생성자입니다 기본적으로 개인. (실제로, 열렬한 대조업 자 ~ 해야 하다 개인적이어야하며 공개적으로 보호하거나 보호하려고 시도하는 것은 오류입니다). Enum 상수는 공개적이며 액세스 지정자를 허용하지 않습니다. 열거의 다른 구성원은 기본적으로 패키지-민간입니다. (JLS §8.9)

  • 인터페이스 및 주석 유형의 모든 구성원은 다음과 같습니다 기본적으로 공개. (실제로 인터페이스 및 주석 유형의 구성원 ~ 해야 하다 공개적으로, 개인을 비공개로 만들거나 보호하려고 시도하는 것은 오류입니다.) () () () () () () () ()JLS §9.3 ~ 9.5)

  • 공공의 - 응용 프로그램의 어느 곳에서나 액세스 할 수 있습니다.

  • 기본 - 패키지에서 액세스 할 수 있습니다.

  • 보호 - 다른 패키지의 패키지 및 하위 클래스에서 액세스 할 수 있습니다. 또한

  • 사적인 - 수업에서만 액세스 할 수 있습니다.

패키지에 표시됩니다. 기본값. 수정자가 필요하지 않습니다.

수업에만 보인다 (사적인).

세계에 보이는 (공공의).

패키지 및 모든 서브 클래스에 표시됩니다 (보호).

변수와 방법은 호출되는 수정 자없이 선언 할 수 있습니다. 기본 예제 :

String name = "john";

public int age(){
    return age;
}

개인 액세스 수정 자 - 개인 :

개인으로 선언 된 방법, 변수 및 생성자는 선언 된 클래스 자체 내에서만 액세스 할 수 있습니다. 개인 액세스 수정자는 가장 제한적인 액세스 수준입니다. 클래스와 인터페이스는 비공개 일 수 없습니다.

공개 getter 방법이 클래스에 존재하는 경우 개인으로 선언 된 변수는 클래스 밖에서 액세스 할 수 있습니다.

개인 수정자를 사용하는 것은 객체가 자체를 캡슐화하고 외부 세계의 데이터를 숨기는 주요 방법입니다.

예 :

Public class Details{

    private String name;

    public void setName(String n){
        this.name = n;
    }

    public String getName(){
        return this.name;
    }
}

공개 액세스 수정 자 - 공개 :

클래스, 메소드, 생성자, 인터페이스 등 선언 된 대중은 다른 클래스에서 액세스 할 수 있습니다. 따라서 공개 클래스 내부에서 선언 된 필드, 방법, 블록은 Java Universe에 속한 모든 클래스에서 액세스 할 수 있습니다.

그러나 우리가 액세스하려는 공개 클래스가 다른 패키지에있는 경우 공개 클래스를 여전히 가져와야합니다.

클래스 상속으로 인해 클래스의 모든 공개 방법과 변수는 서브 클래스에 의해 상속됩니다.

예시:

public void cal(){

}

보호 된 액세스 수정 자 - 보호 :

슈퍼 클래스로 보호 된 변수, 방법 및 생성자는 다른 패키지의 서브 클래스 또는 보호 된 멤버 클래스의 패키지 내의 클래스에서만 액세스 할 수 있습니다.

보호 된 액세스 수정자는 클래스 및 인터페이스에 적용 할 수 없습니다. 방법, 필드는 보호로 선언 할 수 있지만 인터페이스의 방법과 필드는 보호 될 수 없습니다.

보호 된 액세스는 서브 클래스에 도우미 방법이나 변수를 사용할 수있는 기회를 제공하면서 관련이없는 클래스가 사용하지 않도록합니다.

class Van{

    protected boolean speed(){

    }
}

class Car{
    boolean speed(){
    }

}

이 페이지는 보호 및 기본 액세스 수정 자에 대해 잘 씁니다.

.... 보호 : 보호 된 액세스 수정자는 약간 까다 롭고 기본 액세스 수정 자의 슈퍼 세트라고 말할 수 있습니다. 보호 된 멤버는 동일한 패키지의 액세스에 관한 한 기본 멤버와 동일합니다. 차이점은 보호 된 구성원이 부모 클래스가 존재하는 패키지 외부에있는 멤버가 선언 된 클래스의 서브 클래스에 액세스 할 수 있다는 것입니다.

그러나이 보호 된 구성원은“상속을 통해서만 패키지 외부에 액세스 할 수 있습니다”. 즉, 회원이 서브 클래스 자체에있는 것처럼 직접 다른 패키지에있는 서브 클래스의 보호 된 클래스 멤버에 액세스 할 수 있습니다. 그러나 그 보호 된 멤버는 상위 클래스의 참조를 사용하여 패키지 외부의 서브 클래스에서 액세스 할 수 없습니다. .... ....

David의 답변은 각 액세스 수정 자의 의미를 제공합니다. 각각을 사용하는시기에 관해서는, 모든 클래스와 외부 사용 (API)을위한 각 클래스의 방법 및 기타 개인을 공개하는 것이 좋습니다.

시간이 지남에 따라 일부 클래스 패키지-개인을 만들 때와 서브 클래스로 사용하기 위해 보호 된 특정 방법을 선언 할시기에 대한 감각을 개발할 수 있습니다.

메모: 이것은 단지 A입니다 보충 허용 된 답변.

이것은 Java와 관련이 있습니다 액세스 수정 자.

에서 Java 액세스 수정 자:

Java Access 수정자는 주어진 클래스 및 해당 필드, 생성자 및 방법에 액세스 할 수있는 클래스를 지정합니다. 액세스 수정자는 클래스, 생성자, 필드 및 방법에 대해 별도로 지정할 수 있습니다. Java Access Modifiers는 때때로 일일 음성에서 Java Access 지정자로 언급되지만 올바른 이름은 Java Access Modifiers입니다. 클래스, 필드, 생성자 및 방법은 4 가지 Java 액세스 수정 자 중 하나를 가질 수 있습니다.

  • 목록 항목
  • 사적인
  • 기본 (패키지)
  • 보호
  • 공공의

에서 수업 구성원에 대한 액세스 제어 튜토리얼 :

액세스 레벨 수정자는 다른 클래스가 특정 필드를 사용하거나 특정 방법을 호출 할 수 있는지 여부를 결정합니다. 액세스 제어의 두 가지 수준이 있습니다.

  • 최상위 수준 (공개 또는 패키지-프라이버시) (명시 적 수정자가 없음).
  • 회원 수준에서 공개, 개인, 보호 또는 패키지-프라이버시 (명시 적 수정자가 없음).

수업은 수정 자 공개로 선언 될 수 있으며,이 경우 클래스가 모든 클래스에 보입니다. 클래스에 수정 자 (기본값, 패키지-프라이버시라고도 함)가없는 경우 자체 패키지 내에서만 볼 수 있습니다.

다음 표는 각 수정자가 허용하는 멤버에 대한 액세스를 보여줍니다.

╔═════════════╦═══════╦═════════╦══════════╦═══════╗
║ Modifier    ║ Class ║ Package ║ Subclass ║ World ║
╠═════════════╬═══════╬═════════╬══════════╬═══════╣
║ public      ║ Y     ║ Y       ║ Y        ║ Y     ║
║ protected   ║ Y     ║ Y       ║ Y        ║ N     ║
║ no modifier ║ Y     ║ Y       ║ N        ║ N     ║
║ private     ║ Y     ║ N       ║ N        ║ N     ║
╚═════════════╩═══════╩═════════╩══════════╩═══════╝

첫 번째 데이터 열은 클래스 자체가 액세스 레벨에 의해 정의 된 멤버에 대한 액세스 여부를 나타냅니다. 보시다시피, 수업은 항상 자체 회원에게 액세스 할 수 있습니다. 두 번째 열은 클래스와 동일한 패키지의 클래스 (부모에 관계없이)가 멤버에게 액세스 할 수 있는지 여부를 나타냅니다. 세 번째 열은이 패키지 밖에서 선언 된 클래스의 서브 클래스가 멤버에게 액세스 할 수 있는지 여부를 나타냅니다. 네 번째 열은 모든 클래스가 멤버에 액세스 할 수 있는지 여부를 나타냅니다.

액세스 레벨은 두 가지 방법으로 귀하에게 영향을 미칩니다. 첫째, Java 플랫폼의 클래스와 같은 다른 소스에서 나오는 클래스를 사용하면 액세스 레벨이 자신의 클래스를 사용할 수있는 클래스의 멤버를 결정합니다. 둘째, 클래스를 작성할 때 모든 회원 변수와 클래스의 모든 메소드에 어떤 액세스 수준을 결정해야합니다.

공개 보호 기본값과 개인은 액세스 수정 자입니다.

그것들은 캡슐화 또는 수업의 내용을 숨기고 보여주기위한 것입니다.

  1. 클래스는 공개 또는 기본값 일 수 있습니다
  2. 클래스 멤버는 공개, 보호, 채무 불이행 또는 개인 일 수 있습니다.

비공개는 클래스 기본값 외부에서 액세스 할 수 없습니다. 기본값은 패키지에서만 액세스 할 수 있습니다. 패키지로 보호됩니다. 대중은 모두가 열려 있습니다.

일반적으로 멤버 변수는 개인 정의되지만 회원 방법은 공개됩니다.

종종 나는 모든 언어의 기본 개념을 기억하는 것이 실제 유사성을 만들어 가능하다는 것을 깨달았습니다. Java의 액세스 수정자를 이해하는 데 대한 비유는 다음과 같습니다.

당신이 대학의 학생이고 주말에 당신을 방문 할 친구가 있다고 가정 해 봅시다. 캠퍼스 한가운데에 대학 창립자의 큰 동상이 있다고 가정 해 봅시다.

  • 당신이 그를 캠퍼스로 데려 올 때, 당신과 당신의 친구가 가장 먼저 보는 것은이 동상입니다. 이것은 캠퍼스를 걷는 사람이라면 누구나 대학의 허락없이 동상을 볼 수 있음을 의미합니다. 이것은 조각상을 그대로 만듭니다 공공의.

  • 다음으로, 당신은 친구를 기숙사로 데려 가고 싶지만,이를 위해서는 그를 방문자로 등록해야합니다. 이것은 그가 캠퍼스의 다양한 건물에 들어가기 위해 액세스 패스를 얻는다는 것을 의미합니다. 이것은 그의 액세스 카드를 그대로 만들 것입니다 보호.

  • 친구는 캠퍼스 와이파이에 로그인하고 싶지만 그렇게 할 자격 증명이 없습니다. 그가 온라인으로 얻을 수있는 유일한 방법은 로그인을 그와 공유하는 것입니다. (대학에가는 모든 학생 도이 로그인 자격 증명을 가지고 있습니다). 로그인 자격 증명을 다음과 같이합니다 수정자가 없습니다.

  • 마지막으로, 친구는 웹 사이트에 게시 된 학기의 진행률 보고서를 읽고 싶어합니다. 그러나 모든 학생은 캠퍼스 웹 사이트 의이 섹션에 액세스하기 위해 자신의 개인 로그인이 있습니다. 이것은 이러한 자격 증명을 다음과 같이 만듭니다 사적인.

도움이 되었기를 바랍니다!

의 생각 하는 경우에 액세스 한정자는 단지 그것의 생각에 이 방법(에 모두 적용됩 변수방법):

public -->에서 액세스할 수 있는 모든 곳
private -->만 액세스할 수 있는 동일한 클래스에서는 선언

지금 이 혼란을 발생한 때를 defaultprotected

default -->액세스 수정 키워드 존재합니다.이것은 의미 엄격하게 사용할 수 있 패키지 내의 클래스입니다. 는 외부 패키지 액세스할 수 있습니다.

protected -->약간 덜보다 엄격한 default 서는 동일한 패키지의 클래스에 액세스할 수 있는 서브 클래스 외부 패키지 그것은 선언합니다.

그것은 전부입니다 캡슐화 (또는 Joe Phillips가 말했듯이 최소 지식).

가장 제한적인 (개인)부터 시작하여 나중에 덜 제한적인 수정자가 필요한지 확인하십시오.

우리 모두는 개인, 공개, ...와 같은 방법과 회원 수정자를 사용하지만 개발자가 너무 적은 일은 패키지를 사용하는 것입니다. 정리하다 논리적으로 코드.

예를 들어 : '보안'패키지에 민감한 보안 방법을 넣을 수 있습니다. 그런 다음이 패키지에 보안 관련 코드에 액세스하는 공개 클래스를 넣고 다른 보안 클래스를 유지하십시오. 패키지 비공개. 따라서 다른 개발자는이 패키지 외부에서 공개적으로 사용 가능한 클래스 만 사용할 수 있습니다 (수정자를 변경하지 않는 한). 이것은 보안 기능이 아니라 의지입니다 가이드 용법.

Outside world -> Package (SecurityEntryClass ---> Package private classes)

또 다른 것은 서로에 크게 의존하는 클래스가 동일한 패키지로 끝날 수 있으며 종속성이 너무 강한 경우 결국 리팩토링되거나 병합 될 수 있다는 것입니다.

반대로 모든 것을 설정합니다 공공의 액세스 권한이 무엇인지 또는 안되어서는 안되는 것은 명확하지 않으며, 이로 인해 많은 Javadoc을 작성할 수 있습니다 (컴파일러를 통해 아무것도 시행하지 않습니다 ...).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top