[Java] 5.3. 封裝

廣意來說將物件的資訊與行為變成屬性與方法就是在進行封裝,其中的私有化又對物件的封裝尤其重要。

 

image/svg+xml5.3. 封裝 - Encapsulation class Main{ public static void main( String [] args){ Person p1 = new Person (); p1.id = "k111222000" ; p1.name = " 林⼩美 " ; p1 . gender = 女⽣ " ; p1 . setAge ( 20 ); System.out.println( p1 . getAge ()); p1 . setAge ( 25 ); System.out.println( p1 . getAge ()); p1 . setAge ( 30 ); System.out.println( p1 . getAge ()); } } class Person { String id; String name; String gender; private int age ; void show() { System.out.println( " 我的⾝份證字號是 " + id); System.out.println( " 姓名是 " +name); System.out.println( " 姓別是 " +gender); System.out.println( " 年齡是 " +getAge()); } void setAge( int newAge){ age = newAge; } int getAge () { if ( gender == " 女⽣ " ) return 18 ; return age ; } } class Main{ public static void main( String [] args){ Person p1 = new Person (); p1.id = "k111222000" ; p1.name = " 林⼩美 " ; p1 . gender = 女⽣ " ; p1 . setAge ( 20 ); System.out.println( p1 . getAge ()); } } 執⾏結果 18 class Main{ public static void main( String [] args){ Person p1 = new Person (); p1.id = "k123456789" ; p1.name = " 王⼩明 " ; p1.gender = " 男⽣ " ; p1 . setAge ( 200 ); p1 . setAge ( 500 ); p1 . setAge ( 1000 ); System.out.println( p1 . getAge ()); } } 執⾏結果 1000 class Person { String id; String name; String gender; private int age; void show() { System.out.println( " 我的⾝份證字號是 " + id); System.out.println( " 姓名是 " +name); System.out.println( " 姓別是 " +gender); System.out.println( " 年齡是 " +age); } void setAge ( int newAge ){ if ( newAge < 0 || newAge > 150 ) System.out.println( " 年齡必須介於 0~150 之間 " ); else age = newAge ; } int getAge() { if (gender == " 女⽣ " ) return 18 ; return age; } } class Main{ public static void main( String [] args){ Person p1 = new Person (); p1.id = "k123456789" ; p1.name = " 王⼩明 " ; p1.gender = " 男⽣ " ; p1 . setAge ( 200 ); System.out.println(p1.getAge()); p1 . setAge ( 30 ); System.out.println(p1.getAge()); } } 執⾏結果 年齡必須介於 0~150 之間 30 class Person { String id; String name; String gender; private int age ; void setAge ( int newAge ){ if (newAge < 0 || newAge > 150 ) System.out.println( " 年齡必須介於 0~150 之間 " ); else age = newAge; } int getAge () { if (gender == " 女⽣ " ) return 18 ; return age; } void show() { System.out.println( " 我的⾝份證字號是 " + id); System.out.println( " 姓名是 " +name); System.out.println( " 姓別是 " +gender); System.out.println( " 年齡是 " +age); } } class Person { private String id ; private String name ; private String gender ; private int age ; void show() { System.out.println( " 我的⾝份證字號是 " + id); System.out.println( " 姓名是 " +name); System.out.println( " 姓別是 " +gender); System.out.println( " 年齡是 " +age); } void setID ( String newID ){ id = newID; } String getID (){ return id; } void setName ( String newName ){ name = newName; } String getName (){ return name; } void setGender ( String newGender ){ gender = newGender; } String getGender (){ return gender; } void setAge ( int newAge ){ if (newAge < 0 || newAge > 150 ) System.out.println( " 年齡必須介於 0~150 之間 " ); else age = newAge; } int getAge () { if (gender == " 女⽣ " ) return 18 ; return age; } } class Main{ public static void main( String [] args){ Person p1 = new Person (); p1 . setID ( " k123456789 " ); p1 . setName ( " 王⼩明 " ); p1 . setGender ( " 男⽣ " ); p1 . setAge ( 30 ); System.out.println( p1 . getID ()); System.out.println( p1 . getName ()); System.out.println( p1 . getGender ()); System.out.println( p1 . getAge ()); } } J5_3_1 – Main.java 3. 這位 女⽣ ⼀再的透過年齡取值式取得真實的年齡 J5_3_2 – Person.java 1. 建立⼀個⼈員物件( Person ), 且姓別( gender )為 女⽣ 2. 只要透過年齡設值式( setAge() )即可設定年齡屬性上的 值,⽽透過年齡取值式( getAge() )所取得的值,也會是原本藉 由年齡設值式( setAge() )設定的值。這讓⾝為 女⽣ 的⼈員無 法隱藏她的真實年齡,若想保護女⽣的年齡這⼜要如何作到呢? . 這是⼈員類別( Person ),其中有個私有化的年齡屬性( age )。 2. 這是年齡的取值式( getAge() )。 3. 加上 if 判斷式,如果性別( gender )是女⽣, 則直接回傳 18 ,表⽰女⽣永遠都是 18 歲。 4. 若性別( gender )不是女⽣(即男⽣),則回傳實際的年齡。 J5_3_2 – Main.java 5. 建立⼀個⼈員物件。 6. 將性別屬性( gender )設定為女⽣。 7. 先透過年齡設值式( setAge() )設定年齡為 20 歲。 8. 但因為年齡取值式( getAge() )加上規則的 關係,因此當性別是女⽣時,則會以 18 歲作為回 應,如此即達到 女⽣永遠是 18 的需求了。 J5_3_3 – Main.java 1. 建立⼀個⼈員物件。 2. 這些年齡是不是太超過了⼀點呢?但好像不管設定的 年齡是多⼤,年齡設定式都可以忠實的將給予的年齡設定 在年齡屬性上。正常的年齡應是 0~150 算吧?! 3. 嗯,真的是 1000 歲。 聰明的您⼀定想的年齡設值式( setAge() )是⼀個⽅法,因此可以為年齡設 值式以程式的⽅式加入⼀些規則,好讓年齡介於 0~150 之間。 J5_3_4 – Person.java J5_3_4 – Main.java 1. ⼈員類別( Person )。 2. 這是年齡的設值式( setAge() ),此設值式 會透過 newAge 參數代入新的值⾄年齡屬性中。 3. 透過 if 定義規則,若預設定的年齡 ⼩於 0 或⼤於 150 ,則輸出⼀段訊息告知 年齡的設定必須介於 0~150 之間。 4. 若設定的年齡在 0~150 之間,則 將年齡屬性更新為新設定的數值。 5. 建立⼀個⼈員物件。 6. 當希望設定的年齡不是介於 0~150 歲之間時,則會產⽣ 年齡必須介於 0~150 之間 的訊息,且透過年齡取值式( getAge() ),您會得到 0 的結果。若 希望設定的年齡介於 0~150 歲之間時,則可成功將年齡設定在年齡屬性中,當然 透過年齡取值式取得的年齡會是您給予的年齡數值(除了女⽣以外)。 J5_3_4 – Person.java 1. ⼈員類別( Person )。 2. 封裝即是 private 、設值式與取值式的組合應⽤。 J5_3_5 – Person.java 1. ⼈員類別( Person )。 2. 所有的屬性皆使⽤ private 關鍵字進⾏私有化。 3. ⾝份證字號屬性( id )的設值式與取值式。 4. 姓名屬性( name )的設值式與取值式。 5. 性別屬性( gender )的設值式與取值式。 6. 年齡屬性( age )的設值式與取值式。特別的是, 其中還包含設定年齡與取得年齡的規則。 J5_3_5 – Main.java 7. ⼈員類別( Person )。 8. 封裝後,所有的屬性設定皆改由各屬性的設值式完成。 9. 當然取得各屬性的值時,也必須改由取值式來完成。如此就達到封裝的 ⽬的,讓使⽤⼈員類別的程式設計師不可直接設定與取得屬性上的值,且⼀ 定會遵照其中的規則進⾏設定與取值的動作,這就是封裝的精神。 那對⽅法私有化也屬於封裝的範圍嗎?沒錯,這也是⼀種封裝,其是對⾏為作 封裝,對⽅法私有化,即是對物件內部⾏為進⾏封裝,⽽這些內部⾏為是必須 要、也不充許給外部的程式呼叫的,因此透過 private 將這些內部⽅法私有 化,這也是屬於封裝的⼀種。 年齡取值式,加上女⽣ 18 歲的規則 年齡取值式,加上 0~150 歲的規則 封裝 = private + 設值式 + 取值式 ⼈員類別的 100% 封裝 年齡是女⼈的密秘, 那要怎麼隱藏實際年齡? 若年齡值需要有個範圍, 這時怎麼辦? 1 1 1 1 1 1 2 2

留言