Inheritance & Encapsulation
Modern Programming Languages
4
การนําคลาสมาใชงาน การสืบทอดคุณสมบัติ (Inheritancee) และการซอนรายละเอียด(Encapsulation) 4.1 การนําคลาสมาใชงาน
ลักษณะเดนของการเขียนโปรแกรมเชิงวัตถุอยางหนึ่งคือการนําคลาสกลับมาใชงานไดอีก โดยมีวิธีการนํา คลาสกลับมาใชอีกไดดังนี้ • การนําคลาสที่มีอยูมาใช (Use) • การสืบทอดคุณสมบัติ (Inheritance : “is a”) • การนําคลาสมาใชในลักษณะคอมโพสิชั่น (Composition : “has a”) Use คือการเรียกใชงานระหวางคลาส เชน
คลาส A เรียกใชงาน คลาส B คือ เมธอดในคลาส A สรางออบเจกตของคลาส B หรือรับคา สงกลับจากคลาส B ตัวอยาง สรางคลาส Student เปนคลาสตนแบบเพื่อเอาไวเรียกใชงาน
สรางคลาส UseStudent เพื่อทําการเรียกใชงานคลาส Student
[email protected]
1/31
Inheritance & Encapsulation
Modern Programming Languages
เมื่อทําการคอมไพลและรันโปรแกรม UseStudent.java ผลลัพธที่ได
¾
จากตัวอยางขางตน มาทําความรูจักเมธอด toString() กันกอน @ เมธอด toString เปนเมธอดที่ใชในการแปลงคาในออบเจกตใหเปนขอมูลสตริง เมื่อเราทํา การแสดงผลออบเจกตนั้นดวยคําสั่ง System.out.println() หรือมีการเชื่อมตอออบเจกต นั้นกับขอมูลสตริง โดยรูปแบบของเมธอด toString() แสดงรูปแบบดังนี้
@ @ @
@
จากรูปแบบจะเห็นวาเมธอดมีการกําหนดคาคืนกลับเปนสตริงเทานั้น และคาที่สงคืนนี้เอง จะเปนคาที่ออบเจกตนั้นแปลงใหเปนขอความ พิจารณาในคลาส Student มีเมธอด toString() ที่คืนคาขอมูลสตริง โดยทําการคืนคา ขอมูลของ name และ gpa นั่นเอง พิจารณาในคลาส UseStudent ที่นําคลาส Student มาใชงาน ในบรรทัดที่ 3 มีการสรางออบเจกตพรอมกําหนดคาเริ่มตน ตามคอนสตรัค เตอรที่สรางไว (จะกลาวถึงคอนสตรัคเตอรอยางละเอียดในหัวขอ 4.3) ทํ า การแสดงผลออบเจกต s ด ว ยคํ า สั่ ง ในบรรทั ด ที่ 4 System.out.println(s); คําสั่งนี้ออบเจกต s จะเรียกใชงานเมธอด toString() โดยอัตโนมัติ พิจารณาคําสั่งดังนี้ (โดยที่ s ยังคงเปนออบเจกตของคลาส Student)
ในบรรทัดแรกของภาพขางบนที่มีการคอมเมนต ไมสามารถคอมไพลผานได เนื่องจาก str เปนขอมูลชนิด String และ s เปนขอมูลชนิด Student ในบรรทัดที่ 2 มีการเชื่อมตอขอมูลสตริงกับออบเจกต s เพราะฉะนั้น ออบ เจกต s จะเรียกใชงานเมธอด toString() อัตโนมัติ
คือการสืบทอดคุณสมบัติ เชน บัตรวีซา, บัตรมาสเตอรคารด, บัตร อเมริกันเอ็กซเพรส เปนบัตรเครดิต ซึ่งสามารถสรางคลาสของบัตรเครดิตเพื่อใหบัตรชนิดตางๆสืบ ทอดคุณสมบัติ กลาวคือ บัตรเครดิตประกอบไปดวยองคประกอบพื้นฐานรวมกัน อยางเชน เลขที่ บัตรเครดิต, ชื่อธนาคารที่ใหบริการ, วงเงินบัตรเครดิต และวันหมดอายุของบัตร เปนตน ซึ่งการ ออกแบบระบบที่ดีนั้น ควรที่จะออกแบบใหสามารถนํากลับมาใชใหมได (reuse) โดยไมตองสราง โค ดขึ้ น ใหม ซึ่ ง จะช ว ยทํ า ใหป ระหยัด เวลาในการทํา งาน หรื อ ถ า หากต อ งการแก ไ ขเพิ่ ม เติม ยั ง สามารถทําไดงายอีกดวย ในบทนี้จะเนนในเรื่องของการสืบทอดคุณสมบัติ
Inheritance
[email protected]
(is
a)
2/31
Inheritance & Encapsulation
Composition (has a)
Modern Programming Languages
กลาวคือออบเจกตของคลาส A ประกอบไปดวยออบเจกตของคลาส B
อยางเชน
องคประกอบของรถยนตประกอบขึ้นจากลอ, ประตู, เครื่องยนต ฯลฯ จุดเดนคือสามารถเปลี่ยนออบเจกตไดในขณะ runtime
คลาส Computer เปนตนแบบที่สรางไวเพื่อแสดงสวนประกอบตางๆ ของคอมพิวเตอร ซึ่งใน สวนประกอบตางๆยังสามารถสรางตนแบบของตัวมันเองไดอีกดวย โดยสามารถเขียนแสดงเปนคลาส ไดอะแกรมไดดังรูปดานลาง CPU float cpuSpeed; Computer
Ram
CPU cpu; Ram ram; HardDisk hardDisk; Monitor monitor;
int memSize; HardDisk int capacities; Monitor int monitorSize;
[email protected]
3/31
Inheritance & Encapsulation
ตัวอยาง คลาส
Modern Programming Languages
CPU, Ram, HardDisk
และ
Monitor
เปนองคประกอบของคลาส
Computer
โดยที่คลาส CPU ประกอบไปดวยตัวแปรออบเจกต cpuSpeed ซึ่งเปนชนิด int และเมธอด toString ที่ใชในการคืนคาสตริงที่ตองการแสดงขอมูลของ CPU
โดยที่คลาส Ram ประกอบไปดวยตัวแปรออบเจกต memSize ซึ่งเปนชนิด int และเมธอด toString ที่ใชในการคืนคาสตริงที่ตองการแสดงขอมูลของ Ram
โดยที่คลาส HardDisk ประกอบไปดวยตัวแปรออบเจกต capacities ซึ่งเปนชนิด int และ เมธอด toString ที่ใชในการคืนคาสตริงที่ตองการแสดงขอมูลของ HardDisk
โดยที่คลาส Monitor ประกอบไปดวยตัวแปรออบเจกต moniterSize ซึ่งเปนชนิด int และเมธอด toString ที่ใชในการคืนคาสตริงที่ตองการแสดงขอมูลของ Monitor
[email protected]
4/31
int
Inheritance & Encapsulation
Modern Programming Languages
เมื่อทําการคอมไพลและรันโปรแกรม Computer.java ผลลัพธที่ได
@
จากตัวอยางขางตน ทําการพิจารณาการทํางานของโปรแกรม o บรรทัดที่ 30-33 ทําการกําหนดตัวแปรออบเจกตของคลาส Computer สังเกตไดวา ตัวแปรเหลานี้เปนตัวแปรชนิดอางอิง (ตัวแปรชนิดคลาสนั่นเอง) o บรรทัดที่ 34-41 เปนการสรางเมธอด toString() เพื่อใชในการแสดงรายละเอียดที่ เปนขอมูลขององคประกอบเครื่องคอมพิวเตอรของคลาส Computer o บรรทัดที่ 43 สรางออบเจกตของคลาส Computer สรางออบเจกตของคลาส CPU ซึ่งเปนองคประกอบหนึ่งของ o บรรทัด ที่ 44 Computer โดยการสรางนั้นไมสามารถเรียกใชคําสั่งนี้ไดเลย cpu = new อยาลืมวาตัวแปรอางอิง cpu เปนตัวแปรออบเจกตของคลาส CPU(2.4f); Computer ดังนั้นการเรียกใชงานตองอางอิงชื่อออบเจกต com กอน คือ com.cpu = o o
cpu = new CPU(2.4f); บรรทัดที่ 45-47 การออบเจกตนี้คลายกับในบรรทัดที่ 44
บรรทัดที่ 48 ผลที่ได แสดงรายละเอียดขอมูลขององคประกอบเครื่องคอมพิวเตอร ที่ สรางในเมธอด toString()
[email protected]
5/31
Inheritance & Encapsulation
Modern Programming Languages
4.2 การสืบทอดคุณสมบัติ (Innheritance)
กล า วคื อ เราสามารถออกแบบโปรแกรมเพื่ อ สร า งคลาสต น แบบเพื่ อ ให ค ลาสอื่ น ๆ สามารถสื บ ทอด คุณสมบัติ (inherit) ได โดยทําการสืบทอดทั้งคุณลักษณะ (variable) และพฤติกรรม (method) โดยคลาส ตนแบบที่ยินยอมใหสืบทอดคุณสมบัติไดเรียกวา คลาสแม หรือ superclass หรือ parent class สําหรับคลาส ที่ทําการสืบทอดคลาสตนแบบนั้นเรียกวา คลาสลูก หรือ subclass หรือ child class ในการสืบทอดสามารถ แบงความตองการได คือ การสืบทอดโดยใชคุณสมบัติของคลาสแมที่มีอยู, การสืบทอดโดยการเรี ยกใช คุณลักษณะและพฤติกรรมบางสวนของคลาสแมเพื่อใหโปรแกรมทํางานไดตามตองการ และการสืบทอดโดย สามารถแกไขหรือเปลี่ยนแปลงคุณลักษณะและพฤติกรรมของคลาสแมได 4.2.1
คลาสแมและคลาสลูก • • • •
คลาสแม คือ คลาสที่ยินยอมใหคลาสอื่น สืบทอดคุณสมบัติ คลาสลูก คือ คลาสที่ทําการสืบทอดคุณสมบัติจากคลาสแม คลาสลูก จะไมสามารถสืบทอดคอนสตรัคเตอรของคลาสแม การสืบทอดทําไดโดยการใชคียเวิรด extends
รูปแบบ
Superclass extends
extends Subclass
จากรูปขางบน Superclass ไมสามารถที่จะเรียกใชคุณลักษณะและเมธอดของ Subclass ได
สามารถที่จะเรียกใชคุณลักษณะและเมธอดของ Superclass ได ถา accessibility ของคุณลักษณะและเมธอดไมไดเปนแบบ private
Subclass
[email protected]
6/31
Inheritance & Encapsulation
Modern Programming Languages
ตัวอยางคลาสตนแบบ SuperClass และ SubClass
จาก ตัวอยางคลาสตนแบบ SuperClass และ SubClass สามารถเขียนคลาสไดอะแกรมไดดังนี้ SuperClass int mySuper1 = 7; int mySuper2 = 9; extends SubClass int mySub1 = 10; int mySub2 = 20;
จาก ตั ว อย า งคลาสต น แบบ SuperClass SimpleInherit.java ดังดานลาง
[email protected]
และ SubClass นํ า มาเรี ย กใช ง านดั ง โปรแกรม
7/31
Inheritance & Encapsulation
Modern Programming Languages
ผลลัพธที่ได :
@
จากตัวอยางขางตน ทําการพิจารณาทีละบรรทัด o บรรทัดที่ 3 ทําการออบเจกต sup ของคลาส SuperClass แสดงผลการสรางออบเจกตดังรูป ดานลาง 0xcac268 sup
SuperClass sup = new SuperClass(); mySuper1 = 7; mySuper2 = 9;
o
บรรทัดที่ 4 ทําการออบเจกต sub ของคลาส SubClass แสดงผลการสรางออบเจกตดังรูป ดานลาง ซึ่งจะเห็นไดวา ออบเจกต sub ประกอบไปดวยตัวแปรออบเจกตของคลาส SuperClass เนื่องจาก SubClass สืบทอดคุณสมบัติจาก SuperClass 0x1a16869 sub
SubClass sub = new SubClass(); mySub1 = 10; mySub2 = 20; mySuper1 = 7; mySuper2 = 9;
o o
บรรทัดที่ 6 เปนคําสั่งในการแสดงผลของออบเจกต sup Æ sup.showSuper() ซึ่งจะทําการ แสดงผลของตัวแปรออบเจกต mySuper1 และ mySuper2 บรรทัดที่ 8 เปนคําสั่งในการแสดงผลของออบเจกต sub Æ sub.showSub() ซึ่งจะทําการ แสดงผลของตัวแปรออบเจกต mySub1, mySub2, mySuper1 และ mySuper2
[email protected]
8/31
Inheritance & Encapsulation
Modern Programming Languages
จาก ตั ว อย า งคลาสต น แบบ SuperClass SimpleInherit.java ดังดานลาง
และ SubClass นํ า มาเรี ย กใช ง านดั ง โปรแกรม
ผลลัพธที่ได :
@
จากตัวอยางขางตน ทําการพิจารณาทีละบรรทัด o บรรทัดที่ 3 และ 4 เปนการสรางออบเจกตดังตัวอยางขางตน ซึ่งใชงานคลาสตนแบบเดียวกัน คือ SuperClass และ SubClass o บรรทัดที่ 5 ทําการกําหนดคาใหกับ sub.mySuper1=700 สังเกตจากรูปดานลาง คําสั่งนี้เปน การกําหนดคาใหกับตัวแปร mySuper1 ที่อยูในออบเจกต sub o บรรทัดที่ 6 ทําการกําหนดคาใหกับ sub.mySuper2=900 สังเกตจากรูปดานลาง คําสั่งนี้เปน การกําหนดคาใหกับตัวแปร mySuper2 ที่อยูในออบเจกต sub 0x1a16869 sub
SubClass sub = new SubClass(); mySub1 = 10;
sub.mySuper1=700; sub.mySuper1=900;
mySub2 = 20; mySuper1 = 7; mySuper1 = 700; mySuper2 = 9; mySuper2 = 900;
[email protected]
9/31
Inheritance & Encapsulation
o
o
Modern Programming Languages
บรรทัดที่ 8 เปนคําสั่งในการแสดงผลของออบเจกต sup Æ sup.showSuper() จะทําการ แสดงผลของตัวแปรออบเจกต mySuper1 และ mySuper2 ซึ่งยังไมมีคําสั่งใดเปลี่ยนแปลงคา ในออบเจกต sup บรรทัดที่ 10 เปนคําสั่งในการแสดงผลของออบเจกต sub Æ sub.showSub() ซึ่งจะทําการ แสดงผลของตัวแปรออบเจกต mySub1, mySub2, mySuper1 และ mySuper2 มีการ เปลี่ยนแปลงคา mySuper1 และ mySuper2 ในออบเจกต sub คาที่แสดงออกมาจึงมีการ เปลี่ยนแปลง
4.3 คอนสตรัคเตอร (Constructor)
คอนสตรัคเตอรเปนเมธอดที่ประกอบดวยคําสั่งในการกําหนดคาเริ่มตนของคลาส โดยที่คอนสตรัคเตอรจะถูก เรียกใชงานเมื่อมีการสรางออบเจกตดวคียเวิรด new • คอนสตรัคเตอรเปนเมธอดพิเศษที่มีชื่อเดียวกับชื่อคลาส จะถูกเรียกใชงานเมื่อมีการสรางออบเจกต • คอนสตรัคเตอรเปนเมธอดที่ไมมีการสงคากลับ และไมตองระบุคียเวิรด void รูปแบบ
•
โดยทั่ ว ไปทุ ก คลาสจะต อ งมี ค อนสตรั ค เตอร แ ม จ ะไม มี ก ารกํ า หนดคอนสตรั ค เตอร ใ นโปรแกรม คอมไพเลอรจะทําการสรางคอนสตรัคเตอรที่ไมมีการทํางานอยูภายใน ใหโดยอัตโนมัติ เรียกวา “default constructor” เชน
เมื่อจะเรียกใชงานคลาสตองทําการสรางออบเจกตขึ้นมากอน ดังนี้
• •
•
การกําหนดคอนสตรัคเตอรขึ้นมาเองนั้น จะทําให “default constructor” หายไป ดังนั้นในการสราง ออบเจกต ตองการทําสงผานพารามิเตอรใหสอดคลองคอนสตรัคเตอรที่ทําการกําหนดขึ้นมาดวย หากมีการกําหนดคอนสตรัคเตอรขึ้นมาเพื่อกําหนดคาเริ่มตนใหกับออบเจกต แลวทําให “default constructor” หายไปนั้น ในการสรางออบเจกตในบางครั้งไมมีความจําเปนที่จะตองกําหนดคาเริ่มตน ใหกับออบเจกต เราสามารถสราง “default constructor” เองได โดยกําหนดคอนสตรัคเตอรที่มีการ สงผานคาพารามิเตอรเขา คอนสตรัคเตอรสามารถกําหนดไดหลายรูปแบบคือ มีการสงผานคาพารามิเตอรในแตละคอนสตรัคเตอรที่ แตกตางกัน เรียกวา overloading constructor นี่เปนลักษณะเดนอีกอยางหนึ่งของการเขียนโปรแกรม เชิงวัตถุ ทําใหสามารถทํางานไดหลายรูปแบบดวยการเรียกใชชื่อเดียวกัน ไมเพียงแตคอนสตรัคเตอร เทานั้นเมธอดอื่นๆก็สามารถเปนแบบ overloading ไดเหมือนกัน (กลางถึงในบทที่ 5)
[email protected]
10/31
Inheritance & Encapsulation
Modern Programming Languages
ตัวอยางที่ 1 คลาส Person
จาก ตัวอยางที่ 1 คลาส Person การสรางออบเจกตของคลาส Person ทําไดดังนี้
)9 โดยจากตัวอยางขางตน พารามิเตอรที่สงเขาคอนสตรัคเตอรตัวแรกตองเปน String และตัวที่สองตอง เปน int จาก ตัวอยางที่ 1 คลาส Person ไมสามารถสรางออบเจกตดังขางลางได เนื่องจากพารามิเตอรไม สอดคลองกับคอนสตรัคเตอรที่กําหนด
)2 ตัวอยางที่ 2 คลาส Person
จาก ตัวอยางที่ 2 คลาส Person ประกอบไปดวย 2 คอนสตรัคเตอร เรียกวา overloading constructor ซึ่งจะทําใหสามารถสรางออบเจกตของคลาส Person ได 2 แบบ โดยมีการกําหนด ใหมี “default constructor” และคอนสตรัคเตอรที่ผูเขียนโปรแกรมออกแบบไวใหกําหนดคาเริ่มตนใหกับตัวแปร ออบเจกตคือ name และ age แบบที่ 1 : การสรางออบเจกตแบบนี้ ตัวแปรออบเจกตจะถูกกําหนดคาเริ่มตนโดยจาวา
)9 แบบที่ 2 : การสรางออบเจกตแบบนี้ ตัวแปรออบเจกตจะถูกกําหนดโดยผูเขียนโปรแกรมเปน ผูสรางขึ้น
)9
[email protected]
11/31
Inheritance & Encapsulation
• •
•
Modern Programming Languages
ทบทวน!!! เมื่อทําการสรางออบเจกต โดยคียเวิรด new สิ่งที่เกิดขึ้น คือ มีการจองพื้นที่หนวยความจํา เพื่อเก็บขอมูลของออบเจกต มีกําหนดคาเริ่มตนใหกับตัวแปรของออบเจกต – ตัวแปรที่เปนตัวเลขและตัวอักขระ(char) เปน 0 – ตัวแปรที่เปน boolean เปน false – ตัวแปรออบเจกต เปน null มีการเรียกใชเมธอดพิเศษ(constructor)
ตัวอยาง การเรียกใชงานคอนสตรัคเตอรที่มีการสืบทอดคุณสมบัติ จากคลาสไดอะแกรมดานลาง ประกอบดวยคลาส Child, Parent และ GrandParent โดยมีการสืบทอดเปนลําดับ คือ คลาส Child สืบทอด คุณสมบัติ คลาส Parent และ คลาส Parent สืบทอดคุณสมบัติจากคลาส GrandParent ดังนั้นคลาส Child จะได คุณสมบัติจากคลาส GrandParent มาดวย GrandParent extends Parent extends Child
โปรแกรมตอไปนี้แสดงการสืบทอดคุณสมบัติ แสดงดังคลาสไดอะแกรมขางตนที่กลาวมาแลว โดยในแต ละคลาสกําหนดใหภายใน “default constructor” มีคําสั่งของการแสดงผลขอความอยูในแตละคลาสดวย
จากโปรแกรมขางตนทําการสรางออบเจกต children ชนิดคลาส Child ดังนี้
[email protected]
12/31
Inheritance & Encapsulation @
Modern Programming Languages
จากตัวอยางขางตน ทําการพิจารณาโดยคํานึงถึงคุณสมบัติการสืบทอด o บรรทัดที่ 3 เปนการสรางออบเจกต children ในคลาส Child นั้นกําหนดคอนสตรัคเตอรให แสดงขอความดวย ดังนั้นการสรางออบเจกต children จะไปเรียกคอนสตรัคเตอรของคลาส Child ดวย แตเนื่องจากคลาส Child สืบทอดคุณสมบัติจากคลาส Parent กลาวคือ ถาคลาส แมไมถูกเรียกใชงานคอนสตรัคเตอรขึ้นมา จะเกิดมีคลาสลูกไดอยาไร ทําใหกอนการเรียกคอน สตรัคเตอรของคลาส Child จะทําการเรียก คอนสตรัคเตอรของคลาส Parent กอน ซึ่งหาก พิจารณาตอไปอีกคลาส Parent สืบทอดคุณสมบัติจากคลาส GrandParent ดังนั้นกอนสราง ออบเจกต Parent ตองไปเรีกใชงานคอนสตรัคเตอรของคลาส GrandParent กอน o ผลที่ได คือคลาสที่ยิ นยอมใหคลาสอื่น สืบทอดและอยูสูงสุ ด จะตองถู กเรียกใชงานคอนสตรั ค เตอรขึ้นกอนเสมอ o ทําใหผลการแสดงขอมูลที่ไดทําการเรียกใชงานคอนสตรัคเตอรของคลาส GrandParent ซึ่งอยู บนสุด แลวไลลงมาจนถึงคอนสตรัคเตอรของคลาส Child ที่อยูลางสุด
ผลลัพธที่ได :
4.4 คียเวิรด super และ this •
super
ใชในการอางอิงถึงคลาสแม เพื่อที่จะเรียกใชคุณลักษณะหรือ เมธอดหรือคอนสตรัคเตอรของ
คลาสแม super.methodName(parameters); super(parameters); อางอิงถึง คอนสตรัคเตอร •
this ใชในการอางถึงคลาสของตัวเอง(คลาสลูก) เพื่อเรียกใชคุณลักษณะหรือเมธอดของคลาสตัวเอง this.varName; this.methodName(parameters);
ตัวอยาง การเรียกใชคียเวิรด super
[email protected]
13/31
Inheritance & Encapsulation
Modern Programming Languages
ทําการพิจารณาพิจารณาในกรอบที่ครอบคลุมบรรทัดที่ 13 และ 14 จะเห็นวาคําสั่งในสองบรรทัด เหมือนกับคําสั่งที่อยูในเมธอด showSuper() ที่อยูในคลาส SuperClass และเปนคลาสแมดวย เพื่อไมตอง เขียนคําสั่งที่ซ้ําซอน สามารถใชคียเวิรดในการเรียกใชงานเมธอด showSuper() ที่อยูในคลาสแมไดดังนี้
ตัวอยาง การมีตัวแปรออบเจกตของคลาสแมและคลาสลูกที่มีชื่อเหมือนกัน ParentClass int a; super.a
extends BaseClass
this.a
int a;
ผลลัพธที่ได :
@
จากตัวอยางขางตน ทําการพิจารณาโปรแกรมดังนี้ o บรรทัดที่ 5 เนื่องจากโปรแกรมมีชื่อตัวแปรเหมือนกันทั้งในคลาสแมและลูก ดังนั้นจะกําหนดคา ใหกับตัวแปรของคลาสไหน ตองใชคียเวิรด super และ this เขาชวย จากโปรแกรมการเรียก คําสั่ง super.a เปนการอางถึงขอมูลที่อยูในคลาส ParentClass สวนการเรียกคําสั่ง this.a เปน การอางถึงขอมูลที่อยูในคลาส BaseClass o ในเมธอด showAll() เชนกัน การจะแสดงผลจะตองระบุวาจะเลือกแสดงตัวแปรชื่อ a ของ คลาสไหน
[email protected]
14/31
Inheritance & Encapsulation
Modern Programming Languages
ตัวอยาง การสืบทอดคุณสมบัติและคอนสตรัคเตอร Person String name; char sex;
extends Student
Teacher
สังเกตวาคลาส Person มีคอนสตรัคเตอรการกําหนดใหรับพารามิเตอร ดังนั้น ในการสรางออบเจกต Person จะตองสงผานคาพารามิเตอร ใหสอดคลองกันดวย
ถาหากวาคลาส Person สรางคอนสตรัคเตอรที่มีการสงพารามิเตอรเขาดังนี้ Person(String name, char sex)
ใหสังเกตวาชื่อตัวแปรที่ใชเก็บคาพารามิเตอรที่สงเขามานั้น มีชื่อเหมือนกับตัวแปรออบเจกต ดังนั้นใน การกําหนดคาเริ่มตนในเมธอดพิเศษนี้ จะตองมีการระบุวาตองการเก็บคาใหกับตัวแปรออบเจกต ไมเชนนั้น จะถูกมองวาเปนตัวแปรโลคอล สามารถใชงานไดในเมธอดเทานั้น จะไมมองวาเปนการกําหนดคาใหกับตัว แปรออบเจกต สามารถทําไดดังนี้ Person(String name, char sex) { this.name = name; this.sex = sex; }
คียเวิรด this เปนตัวระบุวาตองการกําหนดคาใหกับตัวแปรออบเจกต ของคลาส Person
[email protected]
15/31
Inheritance & Encapsulation
Modern Programming Languages
คลาส Teacher และ Student ทําการสืบทอดคุณสมบัติของคลาส Person จากตัวอยางการเรียกใชงาน คอนสตรัคเตอรที่มีการสืบทอดคุณสมบัตินั้น จะเห็นไดวาถาคลาสแมไมถูกเรียกใชงานคอนสตรัคเตอรขึ้นมา จะไมเกิดคลาสลูก ดังนั้นคอนสตรัคเตอรของคลาส Teacher และ Student จะตองเรียกใชงานคอนสตรัคเตอร ของคลาส Person และจะตองสงคาพารามิเตอรใหสอดคลองกับคลาสแมดวย เพราะวาถาไมเรียกคอนสตรัค เตอรของคลาสแมจะไมสามารถคอมไพลผานได
จากโปรแกรม School.java ทําการเรียกใชงานคลาส Teacher และ Student
ผลลัพธที่ได :
@
จากตัวอยางขางตน ทําการพิจารณาโปรแกรมดังนี้ o บรรทัดที่ 8 และ 11 ทําการแสดงผลออบเจกต t และ s เนื่องจากคลาส Person มีการกําหนด เมธอด toString() (ไดทําการกลาวถึงเมธอดนี้ไปลวในขางตน วาเปนเมธอดที่ใชสําหรับแปลง ออบเจกตใหเปน String) จากโปรแกรมนี้ System.out.println(t); จะถูกเรียกใชเปน System.out.println(t.toString()); โดยอัตโนมัติ
[email protected]
16/31
Inheritance & Encapsulation
o o
Modern Programming Languages
โดยทั่วไปคําสั่งแสดงผลออบเจกต จะแสดงผลเปนชื่อคลาสและตําแหนงหนวยความจําของออบ เจกตนั้น หากทําการคอมเมนตเมธอด toString() ในคลาส Person แลวผลที่ไดเปนดังนี้
4.5 การซอนรายละเอียด (Encapsulation) •
Encapsulation คือการปองกันไมใหออบเจกตภายนอกเขาถึงขอมูลไดอยางอิสระ สามารถทําไดดังนี้ o o
4.5.1
การรวบรวมคุณลั กษณะและเมธอด มารวมอยูใ นที่เดียวกั น ซึ่งเรีย กวา เปน การจัดเก็บใน ลักษณะของแพ็คเกจ (package) กําหนดกลไกในการเขาถึงตัวแปร, เมธอดและคลาส โดยใชคียเวิรด public, private และ protected ถาไมระบุจะถือวาเปน default
กลไกในการเขาถึงตัวแปร, เมธอดและคลาส
•
public ทุกคลาสสามารถเรียกใชงานได
•
private สามารถเรียกใชงานไดเฉพาะในคลาสของตัวเอง
•
protected สามารถเรียกใชงานไดในแพ็คเกจเดียวกัน และเปน subclass ของคลาสที่อยูตางแพ็คเกจ
•
default สามารถเรียกใชงานไดในแพ็คเกจเดียวกันเทานั้น
กลไกในการเขาถึงสามารถสรุปไดดังตารางตอไปนี้ subclass
non-subclass
คียเวิรด same pack
4.5.2
difference pack
same pack difference pack
private
2
2
2
2
protected
9
9
9
2
public
9
9
9
9
default
9
2
9
2
แพ็คเกจ (Package)
การรวบรวมคลาสและอินเตอรเฟซตางๆ ที่เกี่ยวของกันไวในที่เดียวกัน เพื่อความสะดวกในการเรียกใชงาน ในหนึ่งแพ็คเกจสามารถมีไดหลายคลาส • package มาตรฐานของ Java API ที่ควรรูจัก o java.lang เก็บคลาสที่มากับภาษา (Built-in) แพ็คเกจนี้ไมตอง import o java.applet เก็บคลาสเกี่ยวกับ applet o java.awt เก็บคลาสเกี่ยวกับ GUI ไมรวม swing
[email protected]
17/31
Inheritance & Encapsulation
4.5.3
Modern Programming Languages
o
java.io เก็บคลาสเกี่ยวกับการจัดการอินพุต, เอาตพุตและไฟล
o
java.net เก็บคลาสเกี่ยวกับการโปรแกรมเน็ตเวิรค
o
java.util เก็บคลาสเกี่ยวกับ utility ซึ่งโปรแกรมทั่วไปตองใช
โครงสรางโปรแกรมของภาษาจาวา
•
package_declaration เปนการระบุวาโปรแกรมอยูในแพ็คเกจใด
•
หากไมมีการระบุ package คอมไพเลอรจะใหคลาสนั้นอยูใน default package คือ directory ปจจุบันที่ใชงานคลาสนั้น import_declaration เปนคําสั่งในการเรียกใชแพ็คเกจอื่น o แพ็คเกจ java.lang ไมจําเปนตอง import เพราะ buit-in มาใหแลว class_declaration เปนคําสั่งในการประกาศคลาส o
•
4.5.4 ¾ ¾
การสรางแพ็คเกจ การสรางแพ็คเกจจะใชคียเวิรด package โดยจะประกาศไวในตอนตนของโปรแกรม โปรแกรมหนึ่งสามารถมีคําสั่ง package ไดเพียงคําสั่งเดียว
รูปแบบ เชน
4.5.5 • •
การใชงานแพ็คเกจ การเรียกใชงานแพ็คเกจ ทําไดโดยใชคียเวิรด import กําหนดไวกอนประกาศคลาส ในหนึ่งโปรแกรมสามารถมีคําสั่ง import ไดหลายค่ําสั่ง
รูปแบบ
หรือ
[email protected]
18/31
Inheritance & Encapsulation
Modern Programming Languages
เชน
ตัวอยาง การสรางแพ็คเกจ
ผลลัพธที่ได : เมื่อทําการคอมไพล กลาวคือจะมีการสรางโฟลเดอร firstpack และมีไฟลนามสกุล .class อยูในโฟลเดอรนั้น ตัวอยาง การเรียกใชแพ็คเกจ firstpack
กอนการรันโปรแกรม AccountBalance.java ตองยายไฟล Balance.java เพราะเมื่อ import firstpack.*; เพื่อเรียกใชคลาส Balance ทําใหเกิดความซ้ําซอน คอมไพเลอรแจงวาหา Balance.class ไม เจอ แสดงดังรูปดานลาง
[email protected]
19/31
Inheritance & Encapsulation
Modern Programming Languages
ผลลัพธที่ได :
ตัวอยาง การสรางแพ็คเกจ mypack ประกอบดวยคลาส Protection, Derived และ SamePackage ดูไดอะแกรมขางลาง จะเห็นวาคลาส Protection มีตัวแปรออบเจกตชนิด int ที่กําหนดกลไกในการเขาถึงขอมูล แตกตางกัน และคลาส Derived สืบทอดคุณสมบัติของคลาส Protection สวนคลาส SamePackage เปนคลาส หนึ่งที่อยูในแพ็คเกจ mypack mypack Protection public int npub = 111 ; protected int n_pro = 222; int n = 333 ; private int n_pri=444 ; extends Derived SamePackage
จากคลาส Protection สังเกตไดวา สามารถเรียกใชตัวแปรไดทุกตัว ในคลาสของตัวเอง
[email protected]
20/31
Inheritance & Encapsulation
Modern Programming Languages
จากคลาส Derived สังเกตไดวา ตัวแปรที่กําหนดเปน private ไมสามารถไดรับการสืบทอดคุณสมบัติ ได
เมื่อทําการเรียกใชออบเจกต p ในคลาส SamePackage สังเกตไดวา ตัวแปรที่กําหนดเปน private ไม สามารถเรียกใชได
ผลลัพธที่ได : จากการคอมไพล
[email protected]
21/31
Inheritance & Encapsulation
Modern Programming Languages
จากโปรแกรม DemoMypack.java ทําการ เมื่อ import mypack.*; เพื่อเรียกใชงานคลาสทั้งสามที่อยู ในแพ็คเกจนี้
ผลลัพธที่ได :
@
จากตัวอยางขางตน ทําการพิจารณาทีละบรรทัดตั้งแตบรรทัดที่ 4-6 วาผลลัพธที่ไดเปนอยางไร โดย คํานึงถึงการสืบทอดคุณสมบัติ และคอนสตรัคเตอร o บรรทัดที่ 4 เปนการสรางออบเจกต Protection ob1 = Protection(); ผลที่ไดเปนการแสดง คําสั่งที่อยูในคอนสตรัคเตอรคลาส Protection ผลลัพธที่ได :
o
บรรทัดที่ 5 เปนการสรางออบเจกต Derived ob2 = Derived(); เนื่องจากคลาส Derived สืบ ทอดคุณสมบัติคลาส Protection ผลที่ไดจึงเรียกใชงานคําสั่งที่อยูในคอนสตรัคเตอรคลาส Protection กอน จากนั้นจึงเรียกใชคอนสตรัคเตอรคลาส Derived
[email protected]
22/31
Inheritance & Encapsulation
Modern Programming Languages
ผลลัพธที่ได :
o
บรรทัดที่ 6 เปนการสรางออบเจกต SamePackage ob3 = SamePackage(); ) ในคอนสตรัค เตอรของคลาส SamePackage บรรทัดแรกในคอนสตรัคเตอรมีการเรียกใชงานคลาส Protection (สรางออบเจกตของคลาส Protection นั่นเอง) ดังนั้นจะแสดงคําสั่งที่อยูในคอน สตรัค เตอรคลาส Protection ก อน แลวจึงแสดงผลขอความอื่น ที่อยูในคอนสตรัคเตอรข อง คลาส SamePackage เอง ผลลัพธที่ได :
ตัวอยาง การสรางแพ็คเกจ anotherpack ประกอบดวยคลาส AnotherProtection และ OtherPackage ดูไดอะแกรมหนาถัดไป จะเห็นวาคลาส AnotherProtection สืบทอดคุณสมบัติของคลาส Protection ที่อยูในแพ็คเกจ mypack ที่ไดทําการสรางไวขางตน สวนคลาส OtherPackage เปนคลาสหนึ่งที่อยู ในแพ็คเกจ anotherpack mypack Protection extends
anotherpack AnotherProtection
public int npub = 111 ; protected int n_pro = 222; int n = 333 ; private int n_pri=444 ; extends
OtherPackage Derived SamePackage
[email protected]
23/31
Inheritance & Encapsulation
Modern Programming Languages
จากโปรแกรมคลาส AnotherProtection สืบทอดคุณสมบัติจากคลาส Protection ซึ่งอยูตาง แพ็คเกจกัน ทําใหไมสามารถเรียกใชตัวแปรที่เปน default และ private ได
เมื่อคลาสอยูตางแพ็คเกจกัน และไมไดเปน subclass กําหนดการเขาถึงเปน public เทานั้น
ผลลัพธที่ได :
สามารถเรียกใชงานไดเฉพาะตัวแปรที่
จากการคอมไพล
[email protected]
24/31
Inheritance & Encapsulation
Modern Programming Languages
จากโปรแกรม DemoAnotherpack.java ทําการ เมื่อ import anotherpack.*; เพื่อเรียกใชงานคลาส ทั้งสองที่อยูในแพ็คเกจนี้
ผลลัพธที่ได :
@
จากตัวอยางขางตน ทําการพิจารณาทีละบรรทัดตั้งแตบรรทัดที่ 4-5 วาผลลัพธที่ไดเปนอยางไร โดย คํานึงถึงการสืบทอดคุณสมบัติ และ constructor o บรรทัดที่ 4 เปนการสรางออบเจกต AnotherProtection ob1 = AnotherProtection(); Derived(); เนื่องจากคลาส AnotherProtection สืบทอดคุณสมบัติคลาส Protection ซึ่งอยู ในแพ็คเกจ mypack ผลที่ไดจึงเรียกใชงานคําสั่งที่อยูในคอนสตรัคเตอรคลาส Protection กอน จากนั้นจึงเรียกใชคอนสตรัคเตอรคลาส AnotherProtection ผลลัพธที่ได :
o
บรรทัดที่ 5 เปนการสรางออบเจกต OtherPackage ob2 = OtherPackage(); ) ในคอนสตรัค เตอรของคลาส OtherPackage บรรทัดแรกในคอนสตรัคเตอรมีการเรียกใชงานคลาส Protection ซึ่งอยูในแพ็คเกจ mypack (สรางออบเจกตของคลาส Protection นั่นเอง) ดังนั้น จะแสดงคําสั่งที่อยูในคอนสตรัคเตอรคลาส Protection กอน แลวจึงแสดงผลขอความอื่นที่อยู ในคอนสตรัคเตอรของคลาส OtherPackage เอง
[email protected]
25/31
Inheritance & Encapsulation
Modern Programming Languages
ผลลัพธที่ได :
[email protected]
26/31
Inheritance & Encapsulation
Modern Programming Languages
แบบฝกหัด 1.
สรางโปรแกรม PrettyGirl.java ทําการสืบทอดคุณสมบัติจากคลาส Person จงแกไขใหโปรแกรมสามารถแสดงผลไดดังนี้
จากผลที่ได กําหนดชื่อ Ann อายุ 19
ขอกําหนด :
ตัวแปรออบเจกต name และ age ตองเปนกําหนดเปน private หามแกไขชื่อพารามิเตอรที่สงเขาคอนสตรัคเตอรของคลาส Person
[email protected]
27/31
Inheritance & Encapsulation
2.
Modern Programming Languages
จากขอ 1. สรางคลาส SmartBoy สืบทอดคุณสมบัติจากคลาส Person โดยที่คลาส SmartBoy มีตัวแปร ออบเจกตเปนตัวแปรอางอิงของคลาส PrettyGirl และทําการกําหนดคา เริ่มตนใหกับออบเจกตของ PrettyGirl ในคอนสตรัคเตอร เพื่อความเขาใจเขียนคลาสไดอะแกรมไดดังนี้ Person private String name; private int age; extends
PrettyGirl
SmartBoy PrettyGirl girl;
เมื่อสรางคลาส SmartBoy ไดแลว ใหเพิ่มโปรแกรมสามารถแสดงผลไดดังนี้ (โดยทําการเพิ่มในเมธอด main ในคลาส PrettyGirl)
3.
สรางโปรแกรม Company.java โดยประกอบไปดวยคลาสดังนี้ Employee public Employee(String name,String lastName) String name; String lastName; extends Manager
extends Secretary
เมื่อทําการรันโปรแกรมแลวใหไดผลดังนี้ ผลที่ได :
[email protected]
28/31
Inheritance & Encapsulation
[email protected]
Modern Programming Languages
29/31
Inheritance & Encapsulation
Modern Programming Languages
Employee public Employee(String n,String l,float f) void raiseSalary(int percent) float getSalary() String name; String lastName; private float salary; extends
extends
Secretary Manager
public Secretary(String n, String l,float s, Manager m) Manager m;
จากรูปคลาสไดอะแกรมดานบน ใหทําการเพิ่มเติมดังนี้ 1. ทําการเพิ่มตัวแปรเงินเดือนในคลาส Employee เปนชนิด float กํานหนดเปน private 2. เมื่อทําการแสดงผล ใหเพิ่มการแสดงผลในสวนของเงินเดือนดวย 3. ใหทําการเพิ่มเมธอด raiseSalary(int percent) ในการเพิ่มเงินเดือนในคลาส Employee
[email protected]
30/31
Inheritance & Encapsulation
Modern Programming Languages
4. ในสวนของคลาส Secretary ใหเพิ่มตัวแปรของออบเจกต เพื่อแสดงวาใครเปน Manager ของ Secretary คนนั้น โดยกําหนดคาเริ่มตนใหกับออบเจกตของ Manager ในคอนสตรัคเตอร 5. ใหลองทําการขึ้นเงินเดือนให Secretary จํานวน 10% โดยเรียกเมธอด raiseSalary(int percent)
ตัวอยางของผลที่ได เปนดังนี้
4.
จากโปรแกรม Company.java ใหทําการสราง Manager 5 คน โดยมีรายละเอียดดังนี้ 1. คนที่ 1 ชื่อ Helen นามสกุล Hunt เงินเดือน 50,000 2. คนที่ 2 ชื่อ Kenny นามสกุล Grants เงินเดือน 60,000 3. คนที่ 3 ชื่อ Citra นามสกุล White เงินเดือน 55,000 4. คนที่ 4 ชื่อ Jane นามสกุล Browns เงินเดือน 70,000 5. คนที่ 5 ชื่อ Billy นามสกุล Lighten เงินเดือน 65,000 โดยทําการสรางเรียงตามลําดับขางตน จากนั้นทําการเรียงลําดับ Manager ตามเงินเดือน เรียงลําดับจากมากไป นอย ในการแสดงผลใหแสดงทั้งชื่อ, นามสกุล และเงินเดือน
[email protected]
31/31