官术网_书友最值得收藏!

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();
                }
            }
主站蜘蛛池模板: 保靖县| 绿春县| 平度市| 济南市| 岢岚县| 都江堰市| 孝义市| 木兰县| 南阳市| 当雄县| 潞城市| 巴东县| 天镇县| 互助| 满城县| 新平| 平山县| 新余市| 龙川县| 从化市| 濮阳市| 万载县| 宁海县| 南汇区| 扎兰屯市| 南木林县| 和硕县| 郎溪县| 五原县| 石家庄市| 久治县| 奎屯市| 宁都县| 娱乐| 洪雅县| 甘洛县| 娄底市| 七台河市| 财经| 聊城市| 和静县|