1.解析
Java有四種訪問權限, 其中三種有訪問權限修飾符,分別為private,public和protected,還有一種不帶任何修飾符。
- private: Java語言中對訪問權限限制的最窄的修飾符,一般稱之為“私有的”。被其修飾的類、屬性以及方法只能被該類的對象訪問,其子類不能訪問,更不能允許跨包訪問。
- default:即不加任何訪問修飾符,通常稱為“默認訪問模式“。該模式下,只允許在同一個包中進行訪問。
- protect: 介於public 和 private 之間的一種訪問修飾符,一般稱之為“保護形”。被其修飾的類、屬性以及方法只能被類本身的方法及子類訪問,即使子類在不同的包中也可以訪問。
- public: Java語言中訪問限制最寬的修飾符,一般稱之為“公共的”。被其修飾的類、屬性以及方法不僅可以跨類訪問,而且允許跨包(package)訪問。
下面用表格的形式來展示四種訪問權限之間的異同點,這樣會更加形象。表格如下所示:
同一個類 |
同一個包 |
不同包的子類 |
不同包的非子類 |
|
Private |
√ |
|||
Default |
√ |
√ |
||
Protected |
√ |
√ |
√ |
|
Public |
√ |
√ |
√ |
√ |
2.Protected
假設在包accesscontrol下面有AccessControlDemo和 Base 兩個類,其中protected double price;是Base類的成員變量,因為兩個類在同一個包中,所以在AccessControlDemo類中可以直接訪問System.out.println(base.price);具體實例如下:
accesscontrol.AccessControlDemo

package accesscontrol; public class AccessControlDemo { public static void main(String[] args) { // TODO Auto-generated method stub Base base=new Base("123-1",120.1); System.out.println(base.price); } }
accesscontrol.Base

package accesscontrol; public class Base { private String isbn; protected double price; //默認構造函數 public Base() { } //構造函數,如果只定義帶參數的構造函數而不定義默認構造函數,那么Base的子類必須定義顯式構造函數 //Implicit super constructor Base() is undefined for default constructor. Must define an explicit public Base(String isbn, double price) { this.isbn = isbn; this.price = price; } public String getIsbn() { return isbn; } public void setIsbn(String isbn) { this.isbn = isbn; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } }
但是假如我們將AccessControlDemo這個類移到test這個包中,我們會發現eclipse中提示錯誤,編譯無法通過,因為在test包中對protected類型的成員變量不可見。
假如我們在test包中創建一個Base類的子類Bulk,也就是說Bulk是Base類不同包的子類。那么在Bulk類中能夠直接訪問protected double price;這個基層自Base類的成員變量,實例如下:
test.AccessControlDemo

package test; public class AccessControlDemo { public static void main(String[] args) { Bulk bulk=new Bulk("123-1",120.1); bulk.print(); } }
test.Bulk

package test; import accesscontrol.Base; public class Bulk extends Base { public Bulk() { super(); } public Bulk(String isbn, double price) { super(isbn, price); } public void print() { System.out.println(this.price); } }