Java基礎(chǔ)分享,一篇文章說(shuō)透Java訪問修飾符
1. 前言
Java中有四種訪問修飾符:private、default(無(wú)相應(yīng)保留字)、protected和public。
今天,就讓我們來(lái)了解一下這四種訪問修飾符合元素的訪問限制吧!
從強(qiáng)到弱依次是private、default、protected和public。
2. 訪問修飾符介紹
java中有四種訪問修飾符:private、default(無(wú)相應(yīng)保留字)、protected和public。其含義如下:
- private:如果一個(gè)元素聲明為private,則元素的訪問權(quán)限僅限于當(dāng)前類。
- default:如果一個(gè)元素聲明為default,則元素的訪問權(quán)限僅限于當(dāng)前包。
- protected:如果一個(gè)元素聲明為protected,則有當(dāng)前包下的元素或其子類可以訪問該元素。
- public:如果一個(gè)元素聲明為public,則所有位置都可以調(diào)用元素(無(wú)論是在同一類中還是在同一包內(nèi))。
四種訪問修飾符合元素的訪問限制,從強(qiáng)到弱依次是private、default、protected、public。如果類A和類B的訪問修飾符是public,當(dāng)類A中的一個(gè)方法想要調(diào)用類B中的一個(gè)方法時(shí),可以根據(jù)下圖確定可訪問性:
3. 以下示例說(shuō)明四種修飾符對(duì)元素的訪問限制
3.1 private
類B中的方法要調(diào)用同包下A的private方法,編譯時(shí)會(huì)報(bào)錯(cuò):
- package p1
- class A {
- private String getName(){
- return "jim";
- }
- public void display(){
- System.out.println(this.getName());
- }
- }
- package p1
- class B{
- public void display(){
- A a = new A();
- System.out.println(a.getName());
- }
- }
3.2 default
類C中的方法要調(diào)用不同包下類A的default方法,編譯時(shí)會(huì)報(bào)錯(cuò):
- package p1
- public class A {
- String getName(){
- return "jim";
- }
- }
- package p1
- public class B{
- public void display(){
- A a = new A();
- System.out.println(a.getName());
- }
- }
- package p2
- public class C {
- public void display(){
- A a = new A();
- System.out.println(a.getName());
- }
- }
3.3 protected
類C中的方法要調(diào)用類A的protected方法,編譯時(shí)會(huì)報(bào)錯(cuò):
- package p1
- public class A {
- protected String getName(){
- return "jim";
- }
- }
- package p2
- public class B extends A {
- public void display(){
- System.out.println(super.getName());
- }
- }
- package p2
- public class C {
- public void display(){
- A a = new A();
- System.out.println(a.getName());
- }
- }
3.4 public
無(wú)訪問限制。
- package p1
- public class A {
- public String getName(){
- return "jim";
- }
- }
- package p2
- public class B {
- public void display(){
- A a = new A();
- System.out.println(a.getName());
- }
- }
4. 當(dāng)子類隱藏(hide)或覆蓋(override)父類方法時(shí),對(duì)訪問修飾符的限制
當(dāng)子類中的方法隱藏/覆蓋父類中的方法時(shí),與父類中相應(yīng)方法的訪問修飾符相比,子類方法的訪問修飾符的訪問限制應(yīng)相同或更弱。這是面向?qū)ο蟮幕驹瓌t,即子類應(yīng)該比父類更完美,因此子類的可訪問性應(yīng)該更強(qiáng)。
舉例如下:
- class Father {
- protected static void staticMethod() {
- }
- public void method() {
- }
- }
- class Son extends Father {
- static void staticMethod() {
- }
- protected void method() {
- }
- }
5. 元素支持的訪問修飾符。
每個(gè)元素(如類別、接口、注釋、結(jié)構(gòu)函數(shù)、成員變量、成員方法等)都會(huì)顯示或隱示訪問修改符,但并不是每個(gè)元素都支持四個(gè)訪問修改符:
- 對(duì)于直接定義在包中的元素,如類、枚舉(本質(zhì)是繼承Enum的類)、接口和注釋(本質(zhì)是繼承Anotation的接口),他們支持的訪問修飾符是public和default。
- 對(duì)于定義在類內(nèi)的元素,如構(gòu)造函數(shù)、成員變量、成員方法、內(nèi)部類別、內(nèi)部接口等,他們支持所有四種訪問修改符。
- 對(duì)于界面中定義的方法,只支持public(如果不指定,則默認(rèn)public);對(duì)于界面中定義的變量,只支持public static final(如果不指定,則默認(rèn)public static final)。補(bǔ)充說(shuō)明:界面支持三種方法,即無(wú)消息體的方法(默認(rèn)修飾符為public abstract),通過(guò)default保留字定義(默認(rèn)修飾符為public),通過(guò)static保留字定義(默認(rèn)修飾符為public)。