Java 액세스 한정자(액세스 제어 문자)
Java는 액세스 권한과 클래스, 속성, 메서드의 기타 기능을 제어하기 위해 일반적으로 명령문 앞에 배치되는 한정자를 사용합니다. 예:
public class className { // body of class } private boolean myFlag; static final double weeks = 9.5; protected static final int BOXWIDTH = 42; public static void main(String[] arguments) { // body of method }
Java에는 액세스 수정자와 비액세스 수정자로 구분되는 많은 수정자가 있습니다. 이 섹션에서는 액세스 한정자만 소개하고, 비액세스 한정자는 나중에 소개하겠습니다.
액세스 한정자는 액세스 제어 문자라고도 하며 클래스, 멤버 변수, 메소드의 사용 권한을 제어할 수 있는 키워드를 말합니다.
객체 지향 프로그래밍에서 액세스 제어 문자는 클래스, 변수, 메서드 및 생성자에 대한 액세스를 보호하는 데 사용할 수 있는 매우 중요한 개념입니다.
Java는 다음 네 가지 액세스 권한을 지원합니다.
public: public
public으로 선언된 클래스, 메소드 및 구조 메소드 및 인터페이스는 다른 클래스에서 액세스할 수 있습니다.
서로 접근하는 여러 퍼블릭 클래스가 서로 다른 패키지로 배포되는 경우 해당 퍼블릭 클래스가 위치한 패키지를 가져와야 합니다. 클래스 상속으로 인해 클래스의 모든 공개 메서드와 변수는 해당 하위 클래스에서 상속될 수 있습니다.
다음 메소드는 공개 액세스 제어를 사용합니다.
public static void main(String[] arguments) { // body of method }
Java 프로그램의 main() 메소드를 공개로 설정해야 합니다. 그렇지 않으면 Java 인터프리터가 작동하지 않습니다. 종류를 실행할 수 있습니다.
protected: protected
protected로 선언된 변수, 메소드 및 생성자는 동일한 패키지의 다른 클래스에서 액세스할 수 있으며 다른 패키지의 하위 클래스에서도 액세스할 수 있습니다.
protected 액세스 한정자는 클래스와 인터페이스를 수정할 수 없습니다. 메서드와 멤버 변수는 protected로 선언할 수 있지만 인터페이스의 멤버 변수와 멤버 메서드는 protected로 선언할 수 없습니다.
하위 클래스는 protected 한정자로 선언된 메서드와 변수에 액세스할 수 있으므로 관련 없는 클래스가 이러한 메서드와 변수를 사용하지 못하도록 보호합니다.
다음 상위 클래스는 protected 액세스 한정자를 사용하고 하위 클래스는 상위 클래스의 bark() 메서드를 재정의합니다.
public class Dog{ protected void bark() { System.out.println("汪汪,不要过来"); } } class Teddy extends Dog{ // 泰迪 void bark() { System.out.println("汪汪,我好怕,不要跟着我"); } }
bark() 메소드가 private으로 선언되면 Dog 이외의 클래스는 이 메소드에 액세스할 수 없습니다. bark()가 public으로 선언되면 모든 클래스가 이 메서드에 액세스할 수 있습니다. 메서드가 해당 클래스의 하위 클래스에만 표시되도록 하려면 해당 메서드를 protected로 선언하세요.
private: private
private 액세스 한정자는 가장 제한적인 액세스 수준이므로 private으로 선언된 메서드, 변수 및 생성자는 해당 클래스가 속한 클래스에서만 액세스할 수 있으며 클래스와 인터페이스는 액세스할 수 없습니다. 비공개로 선언했습니다.
비공개 액세스 유형으로 선언된 변수는 클래스의 공개 Getter/Setter 메소드를 통해 외부 클래스에서만 액세스할 수 있습니다.
개인 액세스 수정자의 사용은 주로 클래스의 구현 세부 사항을 숨기고 클래스의 데이터를 보호하는 데 사용됩니다.
다음 클래스는 비공개 액세스 수정자를 사용합니다.
public class Dog{ private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
예제에서 Dog 클래스의 name 및 age 변수는 비공개 변수이므로 다른 클래스에서 가져올 수 없습니다. 직접 이 변수의 값을 설정합니다. 다른 클래스가 변수를 작동할 수 있도록 하기 위해 두 쌍의 공용 메소드(getName()/setName() 및 getAge()/setAge())가 정의되어 있으며 이는 전용 변수의 값을 가져오고 설정하는 데 사용됩니다.
이 장에서 논의할 Java의 키워드입니다. 이 키워드에 대한 자세한 설명을 클릭하면 미리 볼 수 있습니다.
클래스의 비공개 변수에 액세스하는 메서드를 정의하는 것이 일반적입니다. 변수 이름 앞에 "get" 또는 "set"을 추가하고 변수의 첫 글자를 대문자로 시작합니다. 예를 들어, 개인 변수 이름을 가져오는 메소드는 getName()이고, 이름을 설정하는 메소드는 setName()입니다. 이러한 메서드는 자주 사용되며 Getter 및 Setter 메서드라는 특정 이름을 갖습니다.
기본값: 키워드를 사용하지 않음
수식자 없이 선언된 속성과 메서드는 동일한 패키지의 클래스에 표시됩니다. 인터페이스의 변수는 암시적으로 public static final로 선언되며 인터페이스의 메소드에 대한 액세스 권한은 기본적으로 공개됩니다.
다음 예에서 볼 수 있듯이 클래스, 변수 및 메소드는 수정자 없이 정의됩니다.
class Dog{ String name; int age; void bark(){ // 汪汪叫 System.out.println("汪汪,不要过来"); } void hungry(){ // 饥饿 System.out.println("主人,我饿了"); } }
접근 제어 및 상속
다음 메소드 상속 규칙(상속 개념을 이해하지 못하는 독자는 여기를 건너뛰거나 Java 상속 및 다형성 미리보기를 클릭할 수 있음):
상위 클래스에서 public으로 선언된 메소드는 하위 클래스에서도 public이어야 합니다.
상위 클래스에서 protected로 선언된 메서드는 하위 클래스에서 protected 또는 public으로 선언됩니다. 비공개로 선언할 수 없습니다.
상위 클래스에서 기본 수정자로 선언된 메서드는 하위 클래스에서 비공개로 선언될 수 있습니다.
상위 클래스에서 비공개로 선언된 메서드는 상속될 수 없습니다.
액세스 제어 문자 사용 방법
액세스 제어 문자를 사용하면 코드의 권한을 쉽게 제어할 수 있습니다.
자신이 작성한 클래스를 다른 모든 클래스에서 액세스할 수 있도록 해야 하는 경우 클래스를 추가할 수 있습니다. 액세스 제어 문자는 공개로 선언됩니다.
자신의 패키지에 있는 클래스만 클래스에 액세스할 수 있도록 해야 하는 경우 액세스 제어 문자를 생략할 수 있습니다.
클래스의 멤버 데이터를 제어해야 하는 경우 클래스의 멤버 데이터 액세스 제어 코드를 공개, 보호 또는 생략으로 설정할 수 있습니다.
Java 변수 범위
Java에서는 변수 범위를 클래스 수준, 객체 인스턴스 수준, 메서드 수준, 블록 수준의 네 가지 수준으로 나눕니다.
类级变量又称全局级变量或静态变量,需要使用static关键字修饰,你可以与 C/C++ 中的 static 变量对比学习。类级变量在类定义后就已经存在,占用内存空间,可以通过类名来访问,不需要实例化。
对象实例级变量就是成员变量,实例化后才会分配内存空间,才能访问。
方法级变量就是在方法内部定义的变量,就是局部变量。
块级变量就是定义在一个块内部的变量,变量的生存周期就是这个块,出了这个块就消失了,比如 if、for 语句的块。块是指由大括号包围的代码,例如:
{ int age = 3; String name = "www.weixueyuan.net"; // 正确,在块内部可以访问 age 和 name 变量 System.out.println( name + "已经" + age + "岁了"); } // 错误,在块外部无法访问 age 和 name 变量 System.out.println( name + "已经" + age + "岁了");
说明:
方法内部除了能访问方法级的变量,还可以访问类级和实例级的变量。
块内部能够访问类级、实例级变量,如果块被包含在方法内部,它还可以访问方法级的变量。
方法级和块级的变量必须被显示地初始化,否则不能访问。
演示代码:
public class Demo{ public static String name = "微学苑"; // 类级变量 public int i; // 对象实例级变量 // 属性块,在类初始化属性时候运行 { int j = 2;// 块级变量 } public void test1() { int j = 3; // 方法级变量 if(j == 3) { int k = 5; // 块级变量 } // 这里不能访问块级变量,块级变量只能在块内部访问 System.out.println("name=" + name + ", i=" + i + ", j=" + j); } public static void main(String[] args) { // 不创建对象,直接通过类名访问类级变量 System.out.println(Demo.name); // 创建对象并访问它的方法 Demo t = new Demo(); t.test1(); } }
运行结果:
微学苑 name=微学苑, i=0, j=3
更多Java의 액세스 한정자와 변수 범위에 대한 설명相关文章请关注PHP中文网!