搜尋
首頁Javajava教程Java的存取修飾符與變數的作用域講解

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類別所在的套件。由於類別的繼承性,類別所有的公有方法和變數都能被其子類別繼承。

下面的方法使用了公有存取控制:

public static void main(String[] arguments) {
  // body of method
}

Java程式的main() 方法必須設定成公有的,否則,Java解釋器將無法運作該類別。
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。

宣告為私有存取類型的變數只能透過類別中公用的Getter/Setter方法被外部類別存取。

private存取修飾符的使用主要用來隱藏類別的實作細節和保護類別的資料。

下面的類別使用了私有存取修飾符:

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變數為私有變量,所以其他類別不能直接得到並設定該變數的值。為了讓其他類別能夠操作該變量,定義了兩對public方法,getName()/setName() 和 getAge()/setAge(),它們用來取得和設定私有變數的值。

this 是Java中的一個關鍵字,本章會講到,你可以點擊 Java this關鍵字詳解 預覽。

在類別中定義存取私有變數的方法,習慣上是這樣命名的:在變數名稱前面加上“get”或“set”,並將變數的首字母大寫。例如,取得私有變數 name 的方法為 getName(),而設定 name 的方法為 setName()。這些方法經常使用,也有了特定的稱呼,稱為 Getter 和 Setter 方法。
預設的:不使用任何關鍵字

不使用任何修飾符聲明的屬性和方法,對同一個包內的類別是可見的。介面裡的變數都隱式宣告為public static final,而介面裡的方法預設存取權限為public。

如下例所示,類別、變數和方法的定義沒有使用任何修飾符:

class Dog{
  String name;
  int age;
  
  void bark(){ // 汪汪叫
    System.out.println("汪汪,不要过来");
  }
  void hungry(){ // 饥饿
    System.out.println("主人,我饿了");
  }
}

存取控制和繼承

請注意以下方法繼承(繼承概念的讀者可以跳過這裡,或者點擊Java繼承與多型預覽)的規則:
父類別中宣告為public的方法在子類別中也必須為public。
父類別中宣告為protected的方法在子類別中要麼宣告為protected,要麼宣告為public。不能聲明為private。
父類別中預設修飾符宣告的方法,能夠在子類別中宣告為private。
父類別中宣告為private的方法,不能夠被繼承。
如何使用存取控制符

存取控制符可以讓我們很方便的控製程式碼的權限:
當需要讓自己寫的類別被所有的其他類別存取時,就可以將類別的存取控制符宣告為 public。
當需要讓自己的類別只能被自己的套件中的類別存取時,就可以省略存取控制符。
當需要控制一個類別中的成員資料時,可以將這個類別中的成員資料存取控制符設定為 public、protected,或省略。

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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前By尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具