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

Java的存取修飾符與變數的作用域講解

Jan 24, 2017 pm 03:34 PM
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脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

突破或從Java 8流返回? 突破或從Java 8流返回? Feb 07, 2025 pm 12:09 PM

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

PHP:網絡開發的關鍵語言 PHP:網絡開發的關鍵語言 Apr 13, 2025 am 12:08 AM

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP與Python:了解差異 PHP與Python:了解差異 Apr 11, 2025 am 12:15 AM

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

Java程序查找膠囊的體積 Java程序查找膠囊的體積 Feb 07, 2025 am 11:37 AM

膠囊是一種三維幾何圖形,由一個圓柱體和兩端各一個半球體組成。膠囊的體積可以通過將圓柱體的體積和兩端半球體的體積相加來計算。本教程將討論如何使用不同的方法在Java中計算給定膠囊的體積。 膠囊體積公式 膠囊體積的公式如下: 膠囊體積 = 圓柱體體積 兩個半球體體積 其中, r: 半球體的半徑。 h: 圓柱體的高度(不包括半球體)。 例子 1 輸入 半徑 = 5 單位 高度 = 10 單位 輸出 體積 = 1570.8 立方單位 解釋 使用公式計算體積: 體積 = π × r2 × h (4

PHP與其他語言:比較 PHP與其他語言:比較 Apr 13, 2025 am 12:19 AM

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP與Python:核心功能 PHP與Python:核心功能 Apr 13, 2025 am 12:16 AM

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

創造未來:零基礎的 Java 編程 創造未來:零基礎的 Java 編程 Oct 13, 2024 pm 01:32 PM

Java是熱門程式語言,適合初學者和經驗豐富的開發者學習。本教學從基礎概念出發,逐步深入解說進階主題。安裝Java開發工具包後,可透過建立簡單的「Hello,World!」程式來實踐程式設計。理解程式碼後,使用命令提示字元編譯並執行程序,控制台上將輸出「Hello,World!」。學習Java開啟了程式設計之旅,隨著掌握程度加深,可創建更複雜的應用程式。

如何在Spring Tool Suite中運行第一個春季啟動應用程序? 如何在Spring Tool Suite中運行第一個春季啟動應用程序? Feb 07, 2025 pm 12:11 PM

Spring Boot簡化了可靠,可擴展和生產就緒的Java應用的創建,從而徹底改變了Java開發。 它的“慣例慣例”方法(春季生態系統固有的慣例),最小化手動設置

See all articles