總網頁瀏覽量

2013年1月26日 星期六

存取控制

我們寫程式當寫一個遊戲、系統,
避免對於類別裡面的變數不當設定
(ex:將遊戲角色的年紀設定為負的)
,為了避免這種狀況,通常將變數宣告為private
然後在類別裡面宣告一個public的函式來設定這個變數的值
並且在此函式設置防護措施
如此一來就無法對變數設定不適當的值了

private跟public是存取權限修飾詞

public、private、default、protected
都是存取權限修飾詞


private:
在類別之內,被宣告為private的變數與函式,只能在類別內呼叫與存取

default:(系統預設的存取權限)
在類別之內,被宣告為default的變數與函式,只能在他們宣告的套件(package)內被相關的程式存取。比方說一個套件內有game.java與oop.java檔案,在game裡面的類別宣告為default的變數與函式,可以在oop.java存取、設定值。


package game;
public class detective {
    public int a=1;
    protected int b=2;
    int money=3;
    private int age=4;

public void setAge(int num){

if(num>0 || num<130){
age=num;
System.out.println("角色年紀是"+age);
}
else{
System.out.println("人的年紀沒有負的,也不會超過一百三十歲");

}
}
}


因為age的存取權限修飾詞設定為private,detective類別外部無法直接存取age,如果在detective類別外面直接存取age會出現以下錯誤訊息
game.java:25: error: age has private access in detective
age稱之為私有成員(private member)

money只能被在game套件底下相關程式存取。
在套件之外的程式無法存取money。

實驗:
建立book套件並且在底下建立comic.java檔案
package book;
import game.* ;
public class comic{
public static void main(String[] args){
detective akai = new detective();
akai.money=100;
}

}

必須import game.*  表示引入game套件底下的.java檔案,
否則java會找不到detective這個public類別,無法建立detective物件
也因為detective是public類別所以我們可以在book建立detective物件
detective akai = new detective();//建立detective物件
然而當我們對default的money直接設定值時
akai.money=100;

結果出現
money is not public in detective; cannot be accessed from outside package

Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - money is not public in game.detective; cannot be accessed from outside package at book.comic..main

沒有留言:

張貼留言