Java訪問修飾符public、private、protected及默認(rèn)訪問權(quán)限詳解
前言
在Java編程中,訪問修飾符(Access Modifiers)是控制類、方法、字段和構(gòu)造函數(shù)訪問范圍的重要機(jī)制。Java提供了四種主要的訪問修飾符:public
、private
、protected
和默認(rèn)(不寫修飾符)。不同的修飾符決定了成員或類在類內(nèi)部、同一包內(nèi)、子類以及整個(gè)程序中的可見性。
本文將詳細(xì)介紹這些訪問修飾符的區(qū)別,并討論它們?cè)趯?shí)際開發(fā)中的應(yīng)用場(chǎng)景。
1. public 訪問修飾符
public
修飾符是訪問權(quán)限最寬松的修飾符,表示任何類都可以訪問被修飾的類或類成員。無論這個(gè)類位于哪個(gè)包中,public
成員始終對(duì)所有其他類可見。
特點(diǎn):
- 類:當(dāng)一個(gè)類被聲明為
public
時(shí),任何其他類都可以訪問這個(gè)類。 - 字段、方法、構(gòu)造器:聲明為
public
的字段、方法或構(gòu)造器可以被任何類訪問,不受包和繼承關(guān)系的限制。
示例:
// 文件:Animal.java package com.example; public class Animal { public String name; public void makeSound() { System.out.println("Animal makes a sound"); } }
在這個(gè)例子中,Animal
類和它的 name
字段以及 makeSound()
方法都被聲明為 public
,因此任何其他包中的類都可以訪問它們。
適用場(chǎng)景:
- 公共API:當(dāng)類或方法需要暴露給整個(gè)應(yīng)用程序或多個(gè)模塊時(shí),
public
是理想的選擇。 - 工具類:如
Math
類的靜態(tài)方法通常是public
,因?yàn)檫@些方法是通用工具,需要在多個(gè)地方調(diào)用。
2. private 訪問修飾符
private
修飾符是訪問權(quán)限最嚴(yán)格的修飾符。使用 private
修飾的成員只能在類內(nèi)部訪問,類的外部(包括其子類)無法訪問。
特點(diǎn):
- 類:類不能被聲明為
private
,Java不允許使用private
修飾符來限制類的訪問權(quán)限。 - 字段、方法、構(gòu)造器:聲明為
private
的字段、方法或構(gòu)造器僅在聲明它們的類內(nèi)部可見,其他類無權(quán)訪問。
示例:
// 文件:Person.java package com.example; public class Person { private String ssn; // 社會(huì)安全號(hào)碼 (私密數(shù)據(jù)) private void displaySsn() { System.out.println("SSN: " + ssn); } public void setSsn(String ssn) { this.ssn = ssn; } }
在這個(gè)例子中,ssn
字段和 displaySsn()
方法都是 private
,所以它們只能在 Person
類內(nèi)部被訪問。其他類無法直接讀取或修改 ssn
,只能通過 setSsn()
這樣的 public
方法進(jìn)行控制。
適用場(chǎng)景:
- 信息隱藏:當(dāng)類中的某些數(shù)據(jù)或?qū)崿F(xiàn)細(xì)節(jié)不希望被外部訪問或修改時(shí),使用
private
是最佳選擇,確保了數(shù)據(jù)封裝。 - 安全性:敏感數(shù)據(jù)如密碼、個(gè)人信息等應(yīng)使用
private
修飾符,以防止被意外或惡意篡改。
3. protected 訪問修飾符
protected
修飾符允許類的成員在同一包內(nèi)或繼承關(guān)系中的子類中訪問。與 private
不同的是,protected
使得子類可以訪問父類的受保護(hù)成員。
特點(diǎn):
- 類:類不能聲明為
protected
。 - 字段、方法、構(gòu)造器:聲明為
protected
的成員在同一個(gè)包內(nèi)的所有類中可見,此外,子類也可以訪問它們。
示例:
// 文件:Animal.java package com.example; public class Animal { protected String species; protected void displaySpecies() { System.out.println("Species: " + species); } } // 文件:Dog.java package com.example; public class Dog extends Animal { public void showSpecies() { this.species = "Canine"; // 訪問 protected 成員 this.displaySpecies(); // 訪問 protected 方法 } }
在這個(gè)例子中,Animal
類的 species
字段和 displaySpecies()
方法是 protected
的,Dog
作為其子類可以訪問這些成員。
適用場(chǎng)景:
- 繼承和擴(kuò)展:當(dāng)希望類的某些成員能被子類繼承和使用,但不希望被完全公開時(shí),使用
protected
是合適的選擇。
4. 默認(rèn)(包訪問權(quán)限)
如果在類或成員聲明時(shí)未顯式指定訪問修飾符,則默認(rèn)為包級(jí)訪問權(quán)限。這種訪問權(quán)限僅限于同一包內(nèi)的類,包外的類無法訪問它們。
特點(diǎn):
- 類:如果類沒有顯式聲明為
public
,它就具有包級(jí)訪問權(quán)限,僅對(duì)同一包內(nèi)的類可見。 - 字段、方法、構(gòu)造器:默認(rèn)修飾符允許同包中的類訪問這些成員,但包外的類和子類都無法訪問。
示例:
// 文件:Animal.java package com.example; class Animal { String name; void makeSound() { System.out.println("Animal makes a sound"); } } // 文件:Test.java package com.example; public class Test { public static void main(String[] args) { Animal animal = new Animal(); animal.name = "Lion"; // 同一包內(nèi),訪問包級(jí)成員 animal.makeSound(); } }
在這個(gè)例子中,Animal
類和它的成員沒有訪問修飾符,因此只能在 com.example
包內(nèi)被訪問。Test
類可以訪問 Animal
,但位于其他包中的類將無法訪問 Animal
。
適用場(chǎng)景:
- 包內(nèi)共享:當(dāng)類或成員只需要在同一個(gè)包中共享時(shí),可以使用默認(rèn)訪問權(quán)限。
5. 總結(jié):訪問修飾符的區(qū)別
修飾符 | 類內(nèi)部 | 同一包 | 子類 | 其他包 |
---|---|---|---|---|
public | ?? | ?? | ?? | ?? |
protected | ?? | ?? | ?? | ? |
默認(rèn)(無修飾) | ?? | ?? | ? | ? |
private | ?? | ? | ? | ? |
結(jié)語
在Java中,訪問修飾符是控制類和成員可見性的核心機(jī)制。通過合理使用 public
、private
、protected
和默認(rèn)訪問權(quán)限,開發(fā)者可以實(shí)現(xiàn)更好的數(shù)據(jù)封裝、安全性以及模塊化設(shè)計(jì)。在實(shí)際開發(fā)中,根據(jù)成員的功能和作用域選擇合適的修飾符,是編寫健壯、安全代碼的重要步驟。
到此這篇關(guān)于Java訪問修飾符public、private、protected及默認(rèn)訪問權(quán)限的文章就介紹到這了,更多相關(guān)Java訪問修飾符public、private、protected內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java 實(shí)戰(zhàn)項(xiàng)目之家居購(gòu)物商城系統(tǒng)詳解流程
讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Java實(shí)現(xiàn)一個(gè)家居購(gòu)物商城系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平2021-11-11SpringBoot集成IJPay實(shí)現(xiàn)微信v3支付的示例代碼
本文主要介紹了SpringBoot集成IJPay實(shí)現(xiàn)微信v3支付的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07java接口類中的@selectProvider接口的使用及說明
這篇文章主要介紹了java接口類中的@selectProvider接口的使用及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08Spring?Retry實(shí)現(xiàn)重試機(jī)制的示例詳解
這篇文章主要為大家詳細(xì)介紹了Spring-Retry的用法以及實(shí)現(xiàn)原理是怎么樣的,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,需要的可以了解一下2023-07-07解決idea 項(xiàng)目編譯后沒有class文件的問題
這篇文章主要介紹了解決idea 項(xiàng)目編譯后沒有class文件的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12Spring boot通過HttpSessionListener監(jiān)聽器統(tǒng)計(jì)在線人數(shù)的實(shí)現(xiàn)代碼
這篇文章主要介紹了Spring boot通過HttpSessionListener監(jiān)聽器統(tǒng)計(jì)在線人數(shù)的實(shí)現(xiàn)代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-02-02Spring Boot應(yīng)用Docker化的步驟詳解
這篇文章主要給大家介紹了關(guān)于Spring Boot應(yīng)用Docker化的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04java實(shí)現(xiàn)簡(jiǎn)單音樂播放器
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單音樂播放器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06