Java 學習系列
  • 目錄
  • 新手初入門,切記熟練
    • 參考書籍
    • 安裝 Java
    • 安裝 Eclipse IDE
    • 首次操作 Eclipse
    • 初學常見錯誤 & 提高可讀性
  • 第一章:認識 JAVA
    • 第一支程式:新建檔案
    • 第一支程式:Hello Java
  • 第二章:簡單 Java 程式解析
    • 變數與輸出
    • 重點整理
  • 第三章:變數與資料型態
  • 認識變數與資料型態
  • 溢位
  • 更多資料型態
  • 資料型態的轉換
  • 第四章:運算子、運算式與敘述
    • 運算子、運算式
    • 程式範例
  • 第五章:選擇性敘述與迴圈
    • 選擇性敘述
    • 迴圈
    • 迴圈的跳離
  • 第六章:陣列
    • 一維陣列
    • 二維與多維陣列
  • 第七章:函數
    • 函數與引數
    • 函數傳遞陣列
    • 函數多載
    • 函數 SWAP
  • 第八章:類別
    • 定義類別
    • 使用類別
    • 類別中的函數成員相互呼叫
    • 類別中使用 this
    • 練習:建立圓形類別
    • 傳遞引數與回傳值
    • 多引數
    • 類別中函數的多載
    • 類別成員中的公有與私有
  • 第九章:建構元
    • 認識 建構元
    • 建構元的多載
    • 建構元間的呼叫 - 透過this
    • 建構元中的公有與私有
  • 第十章:實例變數與函數、類別變數與函數
    • 實例變數 與 實例函數
    • 類別變數
    • 類別函數
  • 第11章:類別的繼承
    • 認識類別的繼承
    • 範例:類別的繼承
    • 類別繼承中的建構元呼叫
    • Protected members
    • Overriding
    • super() 與 this()
    • 設定終止繼承
  • 第12章:抽象類別
    • 認識抽象類別
    • 範例:抽象類別
    • 使用抽象類別型態的變數建立物件
  • 第13章:介面Interface
    • 認識介面
    • 範例:介面
    • 介面中的多重繼承
    • 介面的延伸
  • 第14章:例外 Exception
    • 認識例外
    • 例外處理
    • 範例:例外處理
    • 認識例外類別
    • 例外類別捕捉多個例外
    • 於程式中拋出例外
    • 於指定函數拋出例外
    • 自定義例外類別
  • 第15章:執行緒
    • 認識多執行緒
    • 啟動執行緒
    • 實作 RUNNABLE 介面
    • 執行緒生命週期
    • 凍結執行緒 sleep()
    • 凍結執行緒 join()
    • 執行緒的順序
    • 同步處理 Synchronized
  • 習題範例
    • 產生不重複之亂數
  • 後記
  • 致謝
  • 首頁
Powered by GitBook
On this page
  • 私有
  • 公有
  • 注意

Was this helpful?

  1. 第八章:類別

類別成員中的公有與私有

public & private

Previous類別中函數的多載Next認識 建構元

Last updated 4 years ago

Was this helpful?

為了保護資料成員不被任意的修改,在此篇將會談論到透過一個公有私有的機制,來防範這個漏洞。

因此先從私有資料成員開始談論起。

以的範例來舉例:

class Circle{  //定義類別Circle
	double pi=3.14;
	double radius;

	void show_area()
	{
		System.out.println("面積= "+pi*radius*radius);
	}
}
public class ch08_3 {

	public static void main(String[] args) {
		Circle moon=new Circle();  //建立 moon 物件
		moon.pi=3.1415;
		moon.show_area();
	}
}

在資料成員的部分,我們有 pi與 radius; 因為這是一個計算圓面積的程式,在主程式設值給資料成員 radius 聽起來很正常; 雖然主程式並無設值給 pi,但 pi 很有可能因為程式的規模一大,而導致值會有所變更; 同理, radius 也有可能在此時設值為 2 ,但又可能遭到修改。

為了防範此類事情發生,有了 公有與私有 ( public & private) 的機制。

私有

class Circle{  //定義類別Circle
	private double pi=3.14;
	private double radius;

	.....
}

直接在宣告最前方,個別加上 private ,如此一來將無法從類別以外的地方 設定或直接讀取。 進而達到保護的效果。

class Circle{  //定義類別Circle
	private double pi=3.14;
	private double radius;

	void show_area()
	{
		System.out.println("面積= "+pi*radius*radius);
	}
}

在類別函數成員的部分,是可以正常讀取到私有成員 pi 與 radius 的。

public static void main(String[] args) {
		Circle moon=new Circle();  //建立 moon 物件
		moon.radius=-3;
		moon.show_area();
	}

但在主程式的部分,就無法設值給 radius 了。

公有

既然有 私有 private 就有 公有 public

剛剛的程式碼,設定 private 之後,也無法設值計算圓面積,那到底保護了資料成員又有何作用? 將上述的程式做一個修改,成一個較完善的程式,就會慢慢清楚囉~:

class Circle{  //定義類別Circle
	private double pi=3.14;
	private double radius;
	// 設定資料成員為私有
	private double area()
	{  //設定計算面積的函數為私有
	    return pi*radius*radius;
	}

        public void show_area()
        {   //設定列印面積的函數為公有
            System.out.println("area="+ area());
        }

        public void setRadius(double r)
        {   //設定一個設定半徑的函數為公有
            if (r>0)
            {
               radius=r;
               System.out.println("radius= "+radius);
            }
            else System.out.println("半徑輸入錯誤");
        }
}
public class ch08_3 {

	public static void main(String[] args) {
		Circle moon=new Circle();  //建立 moon 物件
		moon.setRadius(3);
		moon.show_area();
	}
}

以下來一步步講解:

首先是類別的部分,設為私有的除了資料成員外,也設定函數成員area 為私有

private double pi=3.14;
private double radius;
// 設定資料成員為私有
private double area()
{  //設定計算面積的函數為私有
    return pi*radius*radius;
}

可以注意到,area 函數 單純為一個計算值的函數。

再來看到設定公有的函數:

分別有 呼叫列印面積的函數

public void show_area()
{   //設定列印面積的函數為公有
            System.out.println("area="+ area());
}

以及設定半徑的函數

public void setRadius(double r)
{   //設定一個設定半徑的函數為公有
     if (r > 0)
     {
        radius=r;
        System.out.println("radius= "+radius);
     }
     else System.out.println("半徑輸入錯誤");
}

主程式方面,由於無法呼叫私有的函數或直接設值給私有資料成員; 因此在此是呼叫公有函數

public static void main(String[] args) {
	Circle moon=new Circle();  //建立 moon 物件
	moon.setRadius(3);
	moon.show_area();
}

這樣有什麼好處呢?除了可以判斷輸入的值是否正確之外,還可以有效保護資料成員不被程式任意的更改。

呼叫設值函數時:會傳進 if else 做判斷,若半徑大於零 就設定 剛剛傳進的值 r 給 radius; 若設定的值小於零,那麼就直接印出輸入錯誤的訊息

moon.setRadius(3);

注意

初次學程式雖然都是寫單一的小程式練習; 但日後一定會有大型的專案撰寫,除了學習相關的觀念,同時也是替日後打下強大的基礎。

本章的 公有與私有 ( public & private) 除了上述示範是在同一支程式底下運作外,在此也要給一個觀念:

  1. 若冠上 public 公有的成員,可以被 其他程式自由的存取

  2. 若冠上 private 私有的成員,除了 package 其他程式無法存取外,自身的程式也無法存取;運作的範圍只在該類別當中

  3. 若省略 公有與私有 ( public & private) 都不使用,那麼成員只會在同一 package 存取使用

本章練習