Java Language
가시성 (클래스 멤버에 대한 액세스 제어)
수색…
통사론
- 공용 유형 이름 [= 값];
- 개인 유형 이름 [= 값];
- 보호 된 유형 이름 [= 값];
- 유형 이름 [= 값];
- public class name {
- 클래스 이름 {
비고
자바 튜토리얼 :
액세스 수준 수정자는 다른 클래스가 특정 필드를 사용하거나 특정 메서드를 호출 할 수 있는지 여부를 결정합니다. 액세스 제어에는 두 가지 레벨이 있습니다.
- 최상위
public
또는 패키지 개인 (명시 적 수정 자 없음). - 멤버 레벨 -
public
,private
,protected
또는 package-private (명시 적 수정 자 없음).
클래스는 수정 자 public
으로 선언 할 수 있습니다.이 경우 해당 클래스는 모든 클래스의 모든 곳에서 볼 수 있습니다. 클래스에 수정자가 없으면 (기본값, package-private 이라고도 함) 자체 패키지 내에서만 볼 수 있습니다.
멤버 레벨에서 public
수정 자나 수정 자 없음 ( package-private )을 최상위 클래스와 동일한 의미로 사용할 수 있습니다. 회원의 경우 private
및 protected
라는 두 가지 액세스 수정자가 있습니다. private
한정자는 멤버가 자신의 클래스에서만 액세스 될 수 있도록 지정합니다. protected
수식자는, 멤버가 독자적인 패키지 ( package-private 와 같이) 내에서 액세스 할 수있는 것 외, 또 다른 패키지 내의 그 클래스의 서브 클래스에 의해서만 액세스 할 수 있도록 (듯이) 지정합니다.
다음 표는 각 수정 자에서 허용하는 멤버에 대한 액세스를 보여줍니다.
액세스 수준 :
모디파이어 | 수업 | 꾸러미 | 아강 | 세계 |
---|---|---|---|---|
public | 와이 | 와이 | 와이 | 와이 |
protected | 와이 | 와이 | 와이 | 엔 |
수정 자 없음 | 와이 | 와이 | 엔 | 엔 |
private | 와이 | 엔 | 엔 | 엔 |
인터페이스 구성원
public interface MyInterface {
public void foo();
int bar();
public String TEXT = "Hello";
int ANSWER = 42;
public class X {
}
class Y {
}
}
인터페이스 멤버는 public
키워드가 생략 된 경우에도 공개 상태로 표시됩니다. 따라서 foo()
, bar()
, TEXT
, ANSWER
, X
및 Y
는 공용으로 표시됩니다. 그러나 MyInterface
는 공개 된 가시성을 가지므로 멤버는 어디에서나 액세스 할 수 있지만 MyInterface
패키지 가시성이있는 경우 해당 멤버는 동일한 패키지 내에서만 액세스 할 수 있습니다.
대중의 시야
클래스, 패키지 및 서브 클래스에 표시됩니다.
Test 클래스의 예제를 보자.
public class Test{
public int number = 2;
public Test(){
}
}
이제 클래스의 인스턴스를 만들어 보겠습니다. 이 예에서는 public
이므로 number
액세스 할 수 있습니다.
public class Other{
public static void main(String[] args){
Test t = new Test();
System.out.println(t.number);
}
}
비공개 공개 설정
private
visibility는 변수가 클래스에 의해서만 액세스 될 수있게합니다. 그들은 종종 public
getter 및 setters 와 함께 사용됩니다.
class SomeClass {
private int variable;
public int getVariable() {
return variable;
}
public void setVariable(int variable) {
this.variable = variable;
}
}
public class SomeOtherClass {
public static void main(String[] args) {
SomeClass sc = new SomeClass();
// These statement won't compile because SomeClass#variable is private:
sc.variable = 7;
System.out.println(sc.variable);
// Instead, you should use the public getter and setter:
sc.setVariable(7);
System.out.println(sc.getVariable());
}
}
패키지 가시성
한정자가 없으면 기본값은 패키지 표시입니다. Java Documentation에서 "[package visibility]는 클래스와 동일한 패키지의 클래스가 해당 패밀리에 액세스 할 수 있는지 여부를 나타냅니다. javax.swing
의이 예제에서,
package javax.swing;
public abstract class JComponent extends Container … {
…
static boolean DEBUG_GRAPHICS_LOADED;
…
}
DebugGraphics
는 동일한 패키지에 있으므로 DEBUG_GRAPHICS_LOADED
에 액세스 할 수 있습니다.
package javax.swing;
public class DebugGraphics extends Graphics {
…
static {
JComponent.DEBUG_GRAPHICS_LOADED = true;
}
…
}
이 기사에서는 주제에 대한 배경 지식을 제공합니다.
보호 된 가시성
보호 된 가시성 원인은이 멤버가 해당 하위 클래스와 함께 패키지에서 볼 수 있음을 의미합니다.
예로서:
package com.stackexchange.docs;
public class MyClass{
protected int variable; //This is the variable that we are trying to access
public MyClass(){
variable = 2;
};
}
이제이 클래스를 확장하여 protected
멤버 중 하나에 액세스하려고 시도합니다.
package some.other.pack;
import com.stackexchange.docs.MyClass;
public class SubClass extends MyClass{
public SubClass(){
super();
System.out.println(super.variable);
}
}
동일한 패키지에서 액세스하는 경우 protected
구성원을 확장하지 않고 액세스 할 수도 있습니다.
이 변경자는 클래스 자체가 아닌 클래스의 멤버에서만 작동합니다.
클래스 구성원 액세스 한정자 요약
접근 수정 자 | 시계 | 계승 |
---|---|---|
은밀한 | 수업 전용 | 상속 될 수 없다. |
수식어 / 패키지 없음 | 패키지 내 | 패키지의 하위 클래스 인 경우 사용할 수 있습니다. |
보호 된 | 패키지 내 | 하위 클래스에서 사용 가능 |
공공의 | 어디에나 | 하위 클래스에서 사용 가능 |
패키지 외부의 하위 클래스에서 액세스 할 수 있도록 메소드 나 변수에 적용 할 수있는 private protected
(키워드 한 번에 두 키워드) 수정자가 있었지만 해당 패키지의 클래스에 대해 private이되었습니다. 그러나 이것은 Java 1.0의 릴리스에서 제거되었습니다 .