- Java面向對象軟件開發
- 姚駿屏 汪衛星主編
- 1308字
- 2018-12-29 19:04:15
2.1.3 類及類成員的訪問權限
Java封裝的一大好處就是保護數據,因此要訪問類或封裝在類中的數據和代碼,必須清楚在什么情況下,它們是可訪問的,或者我們如何來限制別人的訪問。
一個類總可以訪問和調用自己的變量和方法,但這個類之外的程序其他部分是否能訪問這些變量和方法,則由該屬性和方法以及它們所屬類的訪問控制符決定。
1.類的訪問權限
一個類僅有兩個可能的訪問權限:默認的和公有(public)的。當一個類被聲明為public時,該類可被任何包的代碼訪問;如果一個類為默認的訪問權限,那么僅能由同一包內的其他代碼所訪問。如下定義的Rectangle類為默認訪問權限,因此它只能在本身所在的包內被訪問。
class Rectangle{ ... }
2.類成員的訪問權限
類成員的訪問權限不可能大于類的訪問權限。即如果類只能在本包內被訪問,那么作為類的成員也最多只能在本包中被訪問,就算該成員設定為public也同樣受到這個規則的限制。
類成員的可訪問性與定義時所用的修飾符private(私有)、default(缺省)、protected(保護)和public(公共)有關。聲明為private的類成員僅能在本類內被訪問;修飾符在缺省狀態,只能被本類和本包訪問,聲明為protected的類成員可以被本類、本包、本類的子類訪問;聲明為public的類成員可以被所有包內的類所訪問;未用修飾符聲明的類成員,則隱含為在本包內可被訪問。
為清楚起見,將類成員的可訪問性總結在表2-1中。其中,“√”表示允許使用相應的變量和方法。注意,表中列出的類成員可訪問性是針對public類的成員。
表2-1 Java類的成員變量和成員方法的訪問權限

關于子類的概念在下一節講解繼承性的時候詳細講解。
【例2-1】 創建一個包com和其子包bean,將矩形類Rectangle放入該包中;再創建com.demo包,定義RectangleDemo主類并放入com.demo包中,在主方法中使用com.bean包中的Rectangle類,生成一個Rectangle類的對象,打印該對象的信息。
// 源文件Rectangle.java package com.bean; //本類屬于com包的bean子包下 public class Rectangle{ // 該類的權限為public // 私有的成員變量 private double length; private double width; // 求長方形的面積,注意該方法權限 double area(){ return length * width; } /**打印輸出,公共的成員方法*/ public void display(){ // 調用當前對象的成員變量 System.out.println("長:" + length + "\t寬:" + width); // 調用當前對象的成員方法 System.out.println("長方形的面積是:" + area()); } } // 源文件RectangleDemo.java package com.demo; // 本類屬于com.demo包下 import com.bean.*; // 導入com.bean包中所有的類 public class RectangleDemo{ public static void main (String args[]){ // 調用無參構造方法創建一個長方形對象rect Rectangle rect = new Rectangle(); //rect.width=2; //private不允許類外部調用 //rect.length=4; //private不允許類外部調用 //System.out.println("長方形的面積是:"+rect.area()); // 默認權限不同包的類不能調用 rect.display(); // 調用對象rect的成員方法 } }
可以看出,在Rectangle類內,方法area()使用默認訪問,它只能在本包com.bean內被訪問。成員變量length和width被賦予了private訪問權,這意味著它不能被Rectangle類外的代碼訪問,所以在RectangleDemo類內不能直接使用length和width,而public方法display()可以允許其他包的類使用。
3.getter、setter方法
上面的程序引出了一個問題,既然私有屬性不能外部訪問,那么如何給對象中的私有屬性賦值呢?
若需要在其他類中訪問私有屬性,可以通過非私有的setter和getter方法來訪問。這樣的方法常命名為setXxx()和getXxx(),分別實現對該私有屬性的設置和讀取操作。如下編寫了對私有屬性width和length的setter、getter方法。
public void setWidth(double w){ // 設置長方形的寬 width = w; } public double getWidth(){ // 獲取長方形的寬 return width; } public void setLength(double l){ // 設置長方形的長 length = l; } public double getLength(){ // 獲取長方形的長 return length; }
那么,就可以在其他類中利用這兩個方法對私有屬性進行操作了。
public class RectangleDemo{
public static void main (String args[]){
Rectangle rect=new Rectangle(); // 聲明對象rect并實例化
rect.setWidth(10); // 調用setter方法設置成員變量
rect.setLength(20);
rect.display();
}
}
- Getting started with Google Guava
- Learning Selenium Testing Tools with Python
- Cocos2d-x游戲開發:手把手教你Lua語言的編程方法
- Programming ArcGIS 10.1 with Python Cookbook
- MATLAB應用與實驗教程
- 新編Premiere Pro CC從入門到精通
- 匯編語言程序設計(第3版)
- Citrix XenServer企業運維實戰
- Python函數式編程(第2版)
- Android應用開發實戰(第2版)
- WildFly Cookbook
- INSTANT JQuery Flot Visual Data Analysis
- Test-Driven iOS Development with Swift
- Spring Boot從入門到實戰
- Google Adsense優化實戰