>  기사  >  Java  >  Java의 액세스 한정자와 변수 범위에 대한 설명

Java의 액세스 한정자와 변수 범위에 대한 설명

高洛峰
高洛峰원래의
2017-01-24 15:34:351719검색

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는 다음 네 가지 액세스 권한을 지원합니다.

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中文网!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.