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