單元目標
1. 利用封裝保護資料
2. 設計建構式來初始化物件
封裝的概念
封裝的重要性在於,避免重要的資料被不當地修改。以及避免垃圾資料的建立。
舉例來說,學生的座號通常是正整數從1號開始,所以在建立程式時,必須要有封裝的概念,
當程式接收到的座號資料為-1 時,就必須停止存取並且回報錯誤訊息。
使用封裝的概念,有兩個重點:
1. 重要的資料必須建立private 屬性,避免被不正當存取。
2. 使用set() and get() 這個公開方法來進行private 資料的存取。
下面以員工類別(Employee)為例:
step1 : 建立Employee 類別
public class Employee
{
private int EmployeeID; // 權限修飾使用private ,將EmployeeID屬性改為私有屬性。
public void setEmployeeID(int i) // 使用公開方法的set()
{
if(i<0)
{
System.out.println("incorrect ID");
}else
{
EmployeeID = i ;
}
}
public int getEmployeeID() // 使用公開方法的get()
{
return EmployeeID;
}
}
H : private 與 set() & get() 幾乎是會一起出現的,另外如果用了set(),一定要記得寫出get()喔。
因為兩個是一組的。只有符合set () 方法所設定的條件,才會存取並且讓get() 方法使用並輸出。
step2 : 建立EmployeeTest 類別
public class EmployeeTest
{
public static void main(String[] args) // main主程式一定要寫出來喔
{
Employee emp = new Employee(); // 物件參考變數的宣告與初始化也是一定要的
emp.setEmployeeID(64); // 請在()中填入員工編號
System.out.println(emp.getEmployeeID());
}
}
若是要有使用者輸入的選項,則可以修正為:
Employee 類別:
public class Employee {
private int EmployeeID;
public void setEmployeeID(int i)
{
if(i<0)
{
System.out.println("ID不正確");
}else
{
EmployeeID = i;
}
}
public int getEmployeeID()
{
return EmployeeID;
}
public void f1()
{
System.out.println("您的員工ID是:"+EmployeeID);
}
}
EmployeeTest 類別:
public class EmployeeTest {
public static void main(String[] args) // main主程式一定要寫出來喔
{
java.util.Scanner scanner = new java.util.Scanner(System.in); // 此為製作輸入選項必用的程式
System.out.println("請輸入工號");
int a= scanner.nextInt(); // 建立一個可以自由輸入值的變數a
Employee emp = new Employee();
emp.setEmployeeID(a); // 讓setEmployeeID()自動取得a值
emp.f1(); // 呼叫Employee類別中的f1方法,不懂的請看Lesson 8 的文章
}
}
建構式(constructor)
預設建構式:
法則: 當類別內沒有寫入任何建構式時, 程式會自動建立一個預設建構式( H : 但是使用者看不到)
當類別內有寫入一個或是一個以上的建構式時, 程式不會自動產生一個新的預設建構式.
建構式並不會被繼承到子類別中.
1. 建構式語法:
[modifiers] class ClassName
{
[modifiers] ConstructorName([arguments])
{
code_block;
}
}
[modifiers] : 表示權限修飾值
ConstructorName : 是建構式的名稱,必須與類別名稱相同
[arguments] : 表示要傳給建構式的一個或多個引數
使用範例:
讓我們以先前的Employee類別來做範例。如果封裝的概念使用建構式會如何?
Employee 類別
public class Employee {
public Employee(int i) // 建構式在此
{
EmployeeID = i;
}
private int EmployeeID;
public void setEmployeeID(int i)
{
if(i<0)
{
System.out.println("ID不正確");
}else
{
EmployeeID = i;
}
}
public int getEmployeeID()
{
return EmployeeID;
}
public void f1()
{
System.out.println("您的員工ID是:"+EmployeeID);
}
}
EmployeeTest 類別
public class EmployeeTest {
public static void main(String[] args) {
java.util.Scanner scanner = new java.util.Scanner(System.in);
System.out.println("請輸入工號");
int a= scanner.nextInt();
Employee emp = new Employee(a); // 直接在()中填入變數a
//emp.setEmployeeID(a);
emp.f1();
}
}
作業:
請利用封裝與建構式的概念,建立Employee類別中的員工姓名,並且不可以為空字串。
ANS :
Emplotee 類別如下:
public class Employee {
public Employee(int i,String n)
{
EmployeeID = i;
EmployeeName = n;
}
private int EmployeeID;
private String EmployeeName;
public void setEmployeeID(int i)
{
if(i<0)
{
System.out.println("ID不正確");
}else
{
EmployeeID = i;
}
}
public int getEmployeeID()
{
return EmployeeID;
}
public void setEmployeeName(String n)
{
if(n=="")
{
System.out.println("名字不可以為空字串");
}else
{
EmployeeName = n;
}
}
public String getEmployeeName()
{
return EmployeeName;
}
public void f1()
{
System.out.println("您的員工ID是:"+EmployeeID);
}
public void f2()
{
System.out.println("您的員工姓名是:"+EmployeeName);
}
}
EmployeeTest類別:
public class EmployeeTest {
public static void main(String[] args) {
java.util.Scanner scanner = new java.util.Scanner(System.in);
System.out.println("請輸入工號");
int a= scanner.nextInt();
System.out.println("請輸入姓名");
String b = scanner.next();
Employee emp = new Employee(a,b);
emp.f1();
emp.f2();
}
}