it-swarm.dev

공용, 보호, 패키지 개인 및 개인 Java의 차이점은 무엇입니까?

Java에서 publicprotected을 만들고 상속을 처리하는 동안 각 액세스 수정 자, 즉 기본값 (패키지 개인), private, classinterface을 사용할시기에 대한 명확한 규칙이 있습니까?

2830
intrepion

공식 자습서 당신에게 유용 할 수 있습니다.

 │ 클래스 │ 패키지 │ 서브 클래스 │ 서브 클래스 │ 월드 
 │ │ │ (같은 패키지) │ (차이점 패키지) │ 
 ─ 
 ───────────────────────────────────────────────────────────────────── ──────────────────────────────────────────────────────────────────────────────────────────────────── .____.] public │ + │ + │ + │ + │ + │ + │ + │ + │ │ + │ + │ + │ │ + │ + │ + │ ─ + │ + │ + + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ ───────────────────────────────────────────────────────────────────────────────────────────────────────────────── - ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── 무리 ─ + │ + │ + │ │ 
 ───────────────────────────────────────────────────────────────────────────────────── ──────────────────────────────────────────────────────────────────────────────────────────────────── .____.] 개인 │ + │ │ │ 
 
 + : 접근 가능 빈칸 : 접근 불가 
5155
user13673

(경고 : 나는 자바 프로그래머가 아니다. 필자는 펄 프로그래머이다. 펄은 공식적인 보호 장치가 없다. 어쩌면 내가 그 문제를 잘 이해하고있는 이유 일 것이다.))

은밀한

당신이 생각하는 것처럼, 그것이 선언 된 class 만 그것을 볼 수 있습니다.

비공개 패키지

그것이 선언 된 패키지에서만 볼 수 있고 사용할 수 있습니다. 이것은 Java에서 기본값입니다 (일부는 실수로 표시됨).

보호 된

Package Private +는 서브 클래스 또는 패키지 멤버가 볼 수 있습니다.

공공의

누구나 볼 수 있습니다.

게시

내가 제어하는 ​​코드 외부에 표시됩니다. (Java 구문은 아니지만이 토론에서는 중요합니다.).

C++은 "친구"라고 불리는 추가 레벨을 정의합니다.

무엇을 사용해야합니까? 전체 아이디어는 정보를 숨기기위한 캡슐화입니다. 가능한 한 많이 사용자가 수행 한 작업의 세부 사항을 숨기려고합니다. 왜? 왜냐하면 나중에 그들을 바꿀 수 있고 다른 사람의 코드를 깨뜨릴 수 없기 때문입니다. 이를 통해 누군가가 방금 분해 한 코드를 사용하고 있다는 걱정없이 버그를 최적화, 리팩터링, 재 설계 및 수정할 수 있습니다.

따라서 엄지 손가락의 규칙은 사물을 보이는 대로만 보이게 만드는 것입니다. 비공개로 시작하고 필요에 따라 더 많은 가시성을 추가하십시오. 사용자가 알기에 절대적으로 필요한 것을 공개 만하면 공개하는 모든 세부 사항이 시스템을 재 설계 할 수있는 능력을 손상시킵니다.

사용자가 행동을 사용자 정의하여 내선을 공개 할 수 없도록 공개하기보다는 행동을 사용자 정의 할 수있게하려면 이러한 내장을 객체에 집어 넣고 해당 인터페이스를 공개하는 것이 좋습니다. 그렇게하면 새 객체를 간단하게 연결할 수 있습니다. 예를 들어, CD 플레이어를 작성하고 "이 CD에 대한 정보 찾기"비트를 사용자 정의 할 수있게하려는 경우 해당 메소드를 공용으로 설정하지 않고 모든 해당 기능을 자체 객체에 넣고 객체 getter/setter를 public으로 설정하십시오 . 이런 식으로 당신의 용기를 드러내는 것에 대해 인색 한 것은 좋은 구성과 관심사의 분리를 조장합니다.

개인적으로, 나는 단지 "사적"과 "대중"만을 고집합니다. 많은 OO 언어가 있습니다. "Protected"는 편리 할 수 ​​있지만 정말 속임수입니다. 인터페이스가 비공식적 인 것 이상으로되면 컨트롤을 벗어나서 다른 사람의 코드를보고 용도를 ​​찾아야합니다.

인터페이스를 변경 (리팩토링)하기 위해서는 인터페이스를 사용하고있는 모든 코드를 찾아 변경해야합니다. 인터페이스가 비공개 인 경우 문제가 없습니다. 보호 된 경우 모든 하위 클래스를 찾아야합니다. 공개 된 경우 코드를 사용하는 모든 코드를 찾아야합니다. 때로는 가능합니다. 예를 들어 내부 용으로 만 사용되는 회사 코드로 작업하는 경우 인터페이스가 공용인지 여부는 중요하지 않습니다. 회사 저장소에서 모든 코드를 가져올 수 있습니다. 그러나 인터페이스가 "게시"된 경우 컨트롤 외부에서 코드를 사용하면 코드가 붙습니다. 해당 인터페이스 또는 위험 코드를 지원해야합니다. 보호 된 인터페이스조차도 게시 된 것으로 간주 될 수 있습니다 (이것이 내가 보호받는 것에 신경 쓰지 않는 이유입니다).

많은 언어가 공개/보호/개인의 계층 적 성격이 너무 제한적이며 현실과 일치하지 않는다는 것을 알게됩니다. 이를 위해 a trait class 의 개념이 있지만 또 다른 쇼입니다.

422
Schwern

더 나은 버전의 테이블이 있습니다. (모듈 열이있는 미래 증거)

Java Access Modifiers

설명

  • private 멤버 (i)는 동일한 클래스 내에서 only 에 액세스 할 수 있습니다. 선언했다.

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

  • protected 멤버 (k)는 동일한 패키지 의 모든 클래스 내에서 액세스 할 수 있습니다. 다른 패키지의 서브 클래스 내.

  • public 멤버 (l)는 모든 클래스에서 액세스 할 수 있습니다 ( 모듈 에 상주하지 않는 한). 선언 된 패키지를 내 보냅니다).


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

액세스 수정자는 실수로 캡슐화가 깨지는 것을 방지하는 데 도움이되는 도구입니다.(*). 멤버가 클래스, 패키지, 클래스 계층 내부에 있거나 내부에없는 것을 원한다면 자신에게 물어보고 그에 따라 액세스 수준을 선택하십시오.

예 :

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

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

366
aioobe
                | 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         |       ✔       |     ✘     |       ✘       |   ✘    
181
Abdull

쉬운 규칙. 모든 것을 비공개로 선언하는 것으로 시작하십시오. 그리고 필요가 생길 때 대중을 향해 나아가고 디자인은 그것을 보증합니다.

당신이 표현 선택이나 추상화 선택을 드러내고 있다면 회원들을 노출시킬 때 스스로에게 자문 해보십시오. 첫 번째는 관찰 가능한 행동보다는 실제 표현에 너무 많은 의존성을 도입하기 때문에 피하고 싶은 것입니다.

일반적으로 서브 클래 싱을 통해 메소드 구현을 오버라이드하지 않도록 노력합니다. 논리를 망칠 너무 쉽습니다. 재정의하려는 경우 추상화 된 보호 된 메서드를 선언하십시오.

또한 재정의 할 때 @Override 주석을 사용하면 리팩터링 할 때 상황이 깨지지 않도록 할 수 있습니다.

148
John Nilsson

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

"기본"액세스 (키워드 부재로 지정)를 package-private 라고도합니다. 예외 : 인터페이스에서 수정자는 공개 액세스를 의미하지 않습니다. public 이외의 수정자는 금지됩니다. 열거 형 상수는 항상 공개입니다.

개요

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

  • 멤버는 private : 멤버가 호출 코드와 동일한 클래스 내에 정의 된 경우에만 해당됩니다.
  • 멤버가 패키지 비공개 : 호출 코드가 멤버의 즉시 둘러싸는 패키지 내에있는 경우에만 해당됩니다.
  • 멤버는 protected : 동일한 패키지이거나 멤버가 호출 코드를 포함하는 클래스의 수퍼 클래스에 정의 된 경우입니다.
  • 회원은 public : 예입니다.

액세스 지정자가 적용되는 대상

지역 변수와 형식 매개 변수는 액세스 지정자를 사용할 수 없습니다. 범위 지정 규칙에 따라 본질적으로 외부에 액세스 할 수 없으므로 사실상 비공개입니다.

최상위 범위의 클래스의 경우 public 및 package-private 만 허용됩니다. 이 디자인 선택은 protectedprivate이 패키지 수준에서 중복되기 때문에 (패키지 상속이 없기 때문에) 아마도 선택 될 것입니다.

모든 액세스 지정자는 클래스 멤버 (생성자, 메소드 및 정적 멤버 함수, 중첩 클래스)에서 가능합니다.

관련 : Java Class Accessibility

주문

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

공개> 보호> 패키지 개인> 개인

이는 public이 가장 많은 액세스 권한을 제공하고 private이 가장 적은 액세스 권한을 제공함을 의미합니다. 개인 구성원에 대해 가능한 모든 참조는 패키지 개인 구성원에게도 유효합니다. 패키지 전용 멤버에 대한 모든 참조는 보호 된 멤버 등에서 유효합니다. (동일한 패키지의 보호 된 멤버에게 다른 클래스에 대한 액세스 권한을 부여하는 것은 실수로 간주되었습니다.)

노트

  • 클래스의 메소드 are 같은 클래스의 다른 객체의 개인 멤버에 액세스 할 수 있습니다. 보다 정확하게는 클래스 C의 메서드는 모든 서브 클래스의 객체에서 C의 개인 멤버에 액세스 할 수 있습니다. Java는 인스턴스별로 액세스를 제한하지 않으며 클래스별로 만 액세스를 지원하지 않습니다. (private[this]를 사용하여 지원하는 스칼라와 비교하십시오.)
  • 객체를 생성하려면 생성자에 액세스해야합니다. 따라서 모든 생성자가 비공개 인 경우 클래스는 클래스 내에 존재하는 코드 (일반적으로 정적 팩토리 메소드 또는 정적 변수 이니셜 라이저)만으로 구성 할 수 있습니다. 패키지 개인 또는 보호 된 생성자에 대해서도 유사합니다.
    • Java는 수퍼 클래스 생성자를 암시 적으로 또는 명시 적으로 호출하기 위해 서브 클래스의 생성자가 필요하기 때문에 전용 생성자가 있다는 것만으로도 클래스를 외부에서 서브 클래 싱 할 수 없습니다. 그러나 하위 클래스를 포함하는 중첩 클래스를 포함 할 수 있습니다.

내부 수업

내부 클래스와 같은 nested 범위도 고려해야합니다. 복잡성의 한 예는 내부 클래스에 멤버가 있으며 자체적으로 액세스 수정자를 사용할 수 있다는 것입니다. 그래서 당신은 공개 멤버와 개인 내부 수업을 가질 수 있습니다; 회원에게 액세스 할 수 있습니까? (아래 참조) 일반적인 규칙은 범위를보고 재귀 적으로 생각하여 각 수준에 액세스 할 수 있는지 여부를 확인하는 것입니다.

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

이들이 어떻게 상호 작용하는지 맛 보려면이 예제를 고려하십시오. 개인 내부 클래스를 "누설"할 수 있습니다. 이것은 일반적으로 경고입니다.

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

몇 가지 관련 질문 :

104
Mechanical snail

엄지 손가락의 규칙으로 :

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

따라서 액세스 권한을 세 가지 권한으로 나누면 다음과 같습니다.

  • (D) irect (같은 클래스 내의 메소드로부터 호출).
  • (R) eference (클래스에 대한 참조를 사용하거나 "점"구문을 사용하여 메소드를 호출합니다.).
  • (I) nheritance (서브 클래 싱을 통해).

다음 우리는이 간단한 테이블을 가지고 있습니다 :

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

아주 짧게

  • public : 모든 곳에서 액세스 할 수 있습니다.
  • protected : 동일한 패키지의 클래스와 패키지에있는 하위 클래스에서 액세스 할 수 있습니다.
  • default (변경자가 지정되지 않음) : 동일한 패키지의 클래스가 액세스 할 수 있습니다.
  • private : 동일한 클래스에서만 액세스 할 수 있습니다.
48
Ravi

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

  • 우리는 2 개의 클래스가 있다고 가정합니다. FatherSon은 각각 자체 패키지에 있습니다.

    package fatherpackage;
    
    public class Father
    {
    
    }
    
    -------------------------------------------
    
    package sonpackage;
    
    public class Son extends Father
    {
    
    }
    
  • Fatherfoo() 보호 된 메소드를 추가해 보겠습니다.

    package fatherpackage;
    
    public class Father
    {
        protected void foo(){}
    }
    
  • foo() 메소드는 다음 네 가지 컨텍스트에서 호출 할 수 있습니다.

    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. 타입이 부모 클래스이고 참조가 inside foo()이 정의 된 패키지 (fatherpackage) [이것은 컨텍스트 번호에 포함될 수 있습니다. 1]:

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

    1. 부모 클래스이고, outside 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
          }
      }
      
40
Eng.Fouad

비공개

  • 메소드, 변수 및 생성자

private로 선언 된 메소드, 변수 및 생성자는 선언 된 클래스 자체 내에서만 액세스 할 수 있습니다.

  • 클래스 및 인터페이스

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

참고

공용 getter 메소드가 클래스에 있으면 private로 선언 된 변수를 클래스 외부에서 액세스 할 수 있습니다. 수퍼 클래스에서 보호 된 것으로 선언 된 변수, 메서드 및 생성자는 다른 패키지의 하위 클래스 또는 보호 된 멤버 클래스의 패키지 내의 모든 클래스에서만 액세스 할 수 있습니다.


보호됨

  • 클래스 및 인터페이스

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

메소드, 필드는 protected로 선언 할 수 있지만 인터페이스의 메소드와 필드는 protected로 선언 할 수 없습니다.

참고

보호 된 액세스는 하위 클래스가 보조 메소드 또는 변수를 사용할 수있는 기회를 제공하고 관련없는 클래스가이를 사용하지 못하게합니다.


공용

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

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

  • 다른 패키지

그러나 우리가 액세스하려고하는 public 클래스가 다른 패키지에 있으면 public 클래스를 계속 가져와야합니다.

클래스 상속으로 인해 클래스의 모든 공용 메서드와 변수는 하위 클래스에 상속됩니다.


기본값 - 키워드 없음 :

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

  • 동일한 패키지 내에 있음

액세스 제어 수정 자없이 선언 된 변수 또는 메소드는 동일한 패키지의 다른 클래스에서 사용할 수 있습니다. 인터페이스의 필드는 암시 적으로 public static final이며 인터페이스의 메서드는 기본적으로 public입니다.

참고

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

관련 답변

참조 링크

http://docs.Oracle.com/javase/tutorial/Java/javaOO/accesscontrol.htmlhttp://www.tutorialspoint.com/Java/java_access_modifiers.htm

28
Nambi

비공개 : 수업에만 제한적으로 액세스

기본값 (수정 자 없음) : 클래스 및 패키지에 대한 제한된 액세스

Protected : 클래스, 패키지 및 하위 클래스 (내부 및 외부 패키지 모두)에 대한 제한된 액세스

Public : 클래스, 패키지 (all) 및 하위 클래스에 액세스 할 수 있습니다 ... 간단히 말해서, 모든 곳에서.

18
samkit shah

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

16
Joe Phillips

Java의 액세스 수정 자.

Java 액세스 수정자는 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();
  }
}

출력 : Hello

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();
  }
}

출력 : Hello

 Enter image description here

14
Virtual

액세스 한정자는 여러 수준에서 액세스를 제한합니다.

Public : 기본적으로 모든 클래스에서 동일한 패키지에 있는지 여부에 관계없이 액세스 할 수 있습니다.

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

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

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

Protected : 다른 패키지의 하위 클래스와 동일한 패키지의 변수에 액세스 할 수 있습니다. 기본적으로 default + Inherited behavior입니다.

기본 클래스에 정의 된 protected 필드에 접근하기 위해서 자식 클래스의 객체를 생성 할 수 있습니다.

비공개 : 같은 클래스에 액세스 할 수 있습니다.

비 정적 메소드에서는 thisreference (생성자에서도) 때문에 직접 액세스 할 수 있지만 정적 메소드에 액세스하려면 클래스의 오브젝트를 작성해야합니다.

14
Prashant

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

수업에만 표시 ( 비공개 ).

전 세계에 공개 ( 공개 ).

패키지 및 모든 하위 클래스 ( protected )에 표시됩니다.

변수 및 메소드는 호출되는 수정 자없이 선언 될 수 있습니다. 기본 예제 :

String name = "john";

public int age(){
    return age;
}

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

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

Public getter 메서드가 클래스에 있으면 private로 선언 된 변수를 클래스 외부에서 액세스 할 수 있습니다.

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

예 :

Public class Details{

    private String name;

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

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

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

공용으로 선언 된 클래스, 메소드, 생성자, 인터페이스 등은 다른 클래스에서 액세스 할 수 있습니다. 따라서 공용 클래스 내에서 선언 된 필드, 메소드, 블록은 Java 유니버스에 속한 모든 클래스에서 액세스 할 수 있습니다.

그러나 액세스하려고하는 공용 클래스가 다른 패키지에 있으면 public 클래스를 가져와야합니다.

클래스 상속 때문에 클래스의 모든 공용 메서드와 변수는 하위 클래스에 상속됩니다.

예:

public void cal(){

}

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

수퍼 클래스에서 보호 된 것으로 선언 된 변수, 메서드 및 생성자는 다른 패키지의 하위 클래스 또는 보호 된 멤버 클래스의 패키지 내의 모든 클래스에서만 액세스 할 수 있습니다.

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

보호 된 액세스는 하위 클래스가 도우미 메서드 또는 변수를 사용할 수있는 기회를 제공하고 관련없는 클래스가이를 사용하지 못하게합니다.

class Van{

    protected boolean speed(){

    }
}

class Car{
    boolean speed(){
    }

}
12
amila isura

이 페이지의 대부분의 답변을 포함하여 매우 일반적으로 잘못 된 세부 사항을 다루고 싶습니다. "Default"액세스 (액세스 수정자가없는 경우)는 항상 package-private 와 같지는 않습니다. 그것은 무엇인지에 달려 있습니다.

  • 비 멤버 형식 (즉, 다른 형식 내에 선언되지 않은 클래스, 열거 형, 인터페이스 및 주석 형식)은 기본적으로 패키지 전용입니다. ( JLS §6.6.1 )

  • 클래스 멤버와 생성자는 기본적으로 패키지 전용입니다. ( JLS §6.6.1 )

  • 열거 형 생성자는 기본적으로 개인입니다 . (실제로 enum contructors must ​​비공개이어야하며 공개 또는 보호를 시도하는 것은 오류입니다). 열거 형 상수는 공용이며 액세스 지정자를 허용하지 않습니다. 열거 형의 다른 멤버는 기본적으로 패키지 전용입니다. ( JLS §8.9 )

  • 인터페이스 및 주석 유형의 모든 멤버는 기본적으로 public 입니다. (실제로 인터페이스 및 주석 유형의 멤버 필수 공개이어야하며, 개인용 또는 보호용으로 만들려고하면 오류가 발생합니다.) ( JLS §9.3-9.5 )

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

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

  • protected - 다른 패키지의 패키지 및 하위 클래스에서 액세스 할 수 있습니다. 게다가

  • private - 해당 클래스에서만 액세스 할 수 있습니다.

12
Shailendra Singh

이 페이지는 보호 된 기본 접근 수정 자에 대해 잘 쓰고있다.

.... Protected : 보호 된 액세스 한정자는 다소 까다 롭습니다. 기본 액세스 한정자의 상위 집합이라고 할 수 있습니다. 보호 된 구성원은 동일한 패키지의 액세스와 관련하여 기본 구성원과 동일합니다. 차이점은 보호 된 멤버는 부모 클래스가있는 패키지 외부에있는 멤버가 선언 된 클래스의 하위 클래스에서도 액세스 할 수 있다는 것입니다.

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

10
dameng

David의 답은 각 액세스 한정자의 의미를 제공합니다. 각각을 언제 사용할지에 관해서는, 모든 클래스와 외부 사용 (API)을위한 클래스의 메소드를 공개하고 모든 것을 private으로 제안하는 것이 좋습니다.

시간이 지남에 따라 특정 클래스를 패키지 전용으로 만드는 경우와 하위 클래스에서 사용하도록 보호 된 특정 메서드를 선언 할시기에 대한 개념을 개발할 것입니다.

8
Dov Wasserman

참고 : 허용 된 답변에 대한 보충 입니다.

이것은 Java Access Modifiers 와 관련이 있습니다.

Java Access Modifiers 에서 :

Java 액세스 수정자는 주어진 클래스와 해당 필드, 생성자 및 메소드에 액세스 할 수있는 클래스를 지정합니다. 액세스 수정자는 클래스, 생성자, 필드 및 메소드에 대해 별도로 지정할 수 있습니다. Java 액세스 수정 자도 매일 연설에서 Java 액세스 지정자로 언급되지만 올바른 이름은 Java 액세스 수정 자입니다. 클래스, 필드, 생성자 및 메소드는 네 가지 다른 Java 액세스 수정 자 중 하나를 가질 수 있습니다.

  • 목록 항목
  • 은밀한
  • 기본 (패키지)
  • 보호
  • 공공의

클래스 멤버에 대한 액세스 제어 튜토리얼 :

액세스 레벨 수정자는 다른 클래스가 특정 필드를 사용할 수 있는지 또는 특정 메소드를 호출 할 수 있는지 판별합니다. 액세스 제어에는 두 가지 레벨이 있습니다.

  • 최상위 또는 공용 또는 패키지 전용 (명시 적 수정 자 없음).
  • 구성원 수준 (공개, 개인, 보호 또는 패키지 개인) (명시 적 수정 자 없음).

클래스는 수정 자 public으로 선언 될 수 있으며,이 경우 클래스는 모든 클래스에서 볼 수 있습니다. 클래스에 수정자가없는 경우 (기본값, 패키지 전용이라고도 함) 자체 패키지 내에서만 볼 수 있습니다

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

╔═════════════╦═══════╦═════════╦══════════╦═══════╗
║ 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 플랫폼의 클래스와 같이 다른 소스에서 온 클래스를 사용하는 경우 액세스 레벨에 따라 해당 클래스의 멤버 중 자신의 클래스가 사용할 수있는 멤버가 결정됩니다. 둘째, 클래스를 작성할 때 모든 멤버 변수 및 클래스의 모든 메소드에 어떤 액세스 레벨이 있어야하는지 결정해야합니다.

6

Public Protected Default 및 private은 액세스 한정자입니다.

캡슐화, 또는 클래스의 내용을 숨기고 표시하기위한 것입니다.

  1. 수업은 공개 또는 기본값이 될 수 있습니다.
  2. 클래스 멤버는 public, protected, default 또는 private 일 수 있습니다.

클래스 외부에서 비공개 액세스 할 수 없습니다. 기본값은 패키지에서만 액세스 할 수 있습니다. 패키지뿐만 아니라 그것을 확장하는 모든 클래스에서 보호됩니다. 대중은 모두를 위해 열려 있습니다.

일반적으로 멤버 변수는 private로 정의되지만 멤버 메서드는 public입니다.

5
richa_v

종종 나는 모든 언어의 기본 개념을 기억하는 것이 현실 세계의 유추를 만들어 냄으로써 가능하다는 것을 깨달았습니다. 다음은 Java에서 액세스 한정자를 이해하는 비유입니다.

당신이 대학의 학생이고 주말에 당신을 방문 할 친구가 있다고 가정합시다. 캠퍼스 중간에 대학 설립자의 큰 동상이 있다고 가정 해보십시오.

  • 캠퍼스로 데려 갈 때, 당신과 당신 친구가 보는 첫 번째 것이이 상입니다. 즉, 캠퍼스를 걸어 다니는 사람은 대학의 허가없이 동상을 볼 수 있습니다. 이것은 동상을PUBLIC로 만듭니다.

  • 다음으로, 당신은 당신의 기숙사에 친구를 데려 가고 싶지만, 당신은 그를 방문객으로 등록해야합니다. 이것은 캠퍼스의 여러 건물에 들어가기 위해 액세스 패스 (귀하와 동일)를 얻는다는 의미입니다. 이것은 자신의 액세스 카드를PROTECTED로 만들 것입니다.

  • 친구가 캠퍼스 Wi-Fi에 로그인하려고하지만 자격 증명이 없습니다. 그가 온라인으로 접속할 수있는 유일한 방법은 당신이 그 사람과 당신의 로그인을 공유하는 것입니다. (대학에 다니는 모든 학생도이 로그인 자격 증명을 가지고 있음을 기억하십시오.) 이렇게하면 로그인 자격 증명이 NO MODIFIER 로 변경됩니다.

  • 마지막으로 친구가 웹 사이트에 게시 된 학기의 진행 상황 보고서를 읽으 려합니다. 그러나 모든 학생은 캠퍼스 웹 사이트의이 섹션에 액세스하기 위해 개인 로그인을 가지고 있습니다. 이렇게하면이 자격 증명을PRIVATE로 만들 수 있습니다.

희망이 도움이!

5
Greedy Coder

액세스 수정자를 생각할 때이 방법으로 생각하면됩니다 (변수메소드에 모두 적용됨).

public -> 어디에서나 액세스 할 수 있습니다.
private -> 선언 된 동일한 클래스 내에서만 액세스 가능

이제 혼동은 defaultprotected과 관련하여 발생합니다.

default -> 액세스 수정 자 키워드가 없습니다. 즉, 클래스의 패키지 내에서만 사용할 수 있습니다. Nowhere} 그 패키지 외부에서 액세스 할 수 있습니다.

protected -> default보다 약간 덜 엄격하고 동일한 패키지 클래스와 별개로 패키지 외부에있는 하위 클래스에서 액세스 할 수 있습니다. /는 선언되었습니다.

4
Pritam Banerjee

그것은 encapsulation에 관한 것입니다 (또는 Joe Phillips가 말했듯이 최소한 지식 ).

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

우리 모두는 private, public과 같은 메소드와 멤버 수정자를 사용하지만 너무 적은 개발자는 패키지를 논리적으로 organize 코드로 사용하는 것입니다.

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

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

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

반대로 모든 것을 public으로 설정하면 액세스해야하거나 액세스하지 않아야 할 내용이 명확하지 않아 많은 javadoc을 작성할 수 있습니다 (컴파일러를 통해 아무것도 시행하지 않습니다 ... ).

2
Christophe Roussy

액세스 수정 자

enter image description here

나는 Jenkov의 기사 를 좋아한다

다음 표는 각 Java 액세스 수정자를 적용 할 수있는 Java 구성을 요약합니다. enter image description here

은밀한

메서드 나 변수가 private으로 표시되면 (private access 한정자가 할당 된 경우) 같은 클래스 내의 코드 만 변수에 액세스하거나 메서드를 호출 할 수 있습니다. 서브 클래스 내부의 코드는 변수 나 메소드에 액세스 할 수 없으며 외부 클래스의 코드도 사용할 수 없습니다.

개인 액세스 수정 자로 클래스를 표시 할 수 없습니다. 개인 액세스 수정자를 사용하여 클래스를 표시하면 다른 클래스가 클래스에 액세스 할 수 없으므로 클래스를 전혀 사용할 수 없습니다. 따라서 개인 액세스 수정자는 클래스에 허용되지 않습니다.

default

기본 Java 액세스 수정자는 액세스 수정자를 전혀 쓰지 않음으로써 선언됩니다. 기본 액세스 수정자는 클래스 자체의 코드뿐만 아니라이 클래스와 동일한 패키지의 클래스 내부 코드도 기본 액세스 수정자가 지정된 클래스, 필드, 생성자 또는 메소드에 액세스 할 수 있음을 의미합니다. 따라서 기본 액세스 수정자를 패키지 액세스 수정 자라고도합니다.

보호

보호 된 액세스 수정자는 서브 클래스가 수퍼 클래스의 보호 된 메소드 및 멤버 변수 (필드)에 액세스 할 수있는 추가 기능과 함께 기본 액세스 수정 자와 동일한 액세스를 제공합니다. 서브 클래스가 수퍼 클래스와 동일한 패키지에없는 경우에도 마찬가지입니다.

공공의

Java 액세스 수정 자 공개는 액세스 코드의 위치에 관계없이 모든 코드가 클래스, 필드, 생성자 또는 메소드에 액세스 할 수 있음을 의미합니다. 액세스 코드는 다른 클래스와 다른 패키지에있을 수 있습니다.

2
yoAlex5