Upload
others
View
5
Download
0
Embed Size (px)
Citation preview
บทท 3
การเขยนโปรแกรมเชงวตถ Object-Oriented Programming: OOP ยอนไปในป 1967 Dr. Kristen Nygaard ชาวนอรเวย ไดคดคนวธการเขยนโปรแกรมเชงวตถทชอ Simula-67 ซงเปนจดเรมตนของการเขยนโปรแกรมแบบใหมทเรยกวา Object-Oriented Programming (OOP) ขอดของการเขยนโปรแกรมแบบ OOP คอชวยใหผเขยนโปรแกรมสามารถเปลยนแปลงโปรแกรมทเขยนมาแลวไดงายขน และโปรแกรมทเขยนขนมาสามารถน าไปใชในโปรแกรมทเขยนขนใหมได โดยอาจมการแกไขเพยงเลกนอยหรอไมแกไขเลย (Reusable)
การเขยนโปรแกรมแบบ OOP เรมมบทบาทมากขนในปจจบน ผเขยนโปรแกรมจ านวนหนงไดเปลยนการเขยนโปรแกรมแบบกระบวนค าสง (Procedural Programming) ไปเปนแบบ OOP เพราะโปรแกรมสวนใหญทสรางขนโดยการเขยนโปรแกรมแบบกระบวนค าสงมแนวโนมวาจะเกดความซบซอนสง สงผลใหการแกไข การเปลยนแปลงโปรแกรม และการน าบางสวนของโปรแกรมมาใชใหมท าไดยากขน และท าใหเกดปญหาอนๆ ตามมาได
วธการออกแบบโปรแกรม คอ ขอแตกตางระหวางการเขยนโปรแกรมแบบกระบวนค าสงและ OOP การเขยนโปรแกรมแบบเดมใชการออกแบบจากบนลงลาง (Top-Down Approach) กลาวคอผออกแบบจะวเคราะหปญหาโดยรวม (Problem Domain) และหาขนตอนการแกปญหา (Algorithm) โดยแตกปญหาออกเปนสวนยอยๆ หรอฟงกชน และใชภาษาคอมพวเตอร (Programming Language) เชน ภาษา C หรอ Pascal ในการแกปญหาแตละสวน โดยแตละสวนยอย (Module) จะมความสมพนธตอกน ถามการแกไขเปลยนแปลงบางสวนในฟงกชนอาจกระทบกระเทอนทกสวนได ดงนนการออกแบบจากบนลงลางจงเหมาะส าหรบการแกปญหาทไมซบซอน เพราะถาปญหามความซบซอนมากการแกไขมความซบซอนมากขนดวย ขอจ ากดของการออกแบบจากบนลงลางอกประการหนงคอ ไมมความยดหยนของการน าโปรแกรมทเขยนแลวกลบไปใชใหม ฟงกชนทมอยในโปรแกรมเดมอาจไมมความเหมาะสมทจะน าไปใชกบโปรแกรมใหม เพราะฟงกชนนนถกออกแบบใหใชกบการแกปญหาใดปญหาหนงเทานน ตรงขามกบการออกแบบโปรแกรมโดยใหความส าคญกบวตถเปนหลกซงเปนการออกแบบจากลางขนบน (Bottom-Up Approach) การออกแบบจากลางขนบนใหความส าคญกบวตถเปนหลก และพยายามหาวตถทเคยสรางมาแลวมาประกอบในการสรางโปรแกรม ซงจะท าใหประหยดเวลาในการสราง ตวอยางเชน การสรางบาน แทนทจะเรมลงมอกอสรางบานทนท แตชางกอสรางควรจะใหความส าคญกบวสดทใชสรางบานกอน เชนใชไมหรอปนในการสราง ประตเปนไมหรอพลาสตก มขนาดมาตรฐานเทาใด หนาตางแบบใดเปนตน ขอดของการการออกแบบเชงวตถคอ โปรแกรมทถกออกแบบแลวสามารถแกไขไดงายเพราะวตถแตละชนมความเปนอสระตอกน และวตถทสรางขนมาแลวสามารถน ากลบไปใชใหมไดอก ท าไมบรษทยกษใหญผผลตคอมพวเตอรเชน Gateway, IBM, Dell, Apple หรอ HP สามารถเตบโตไดอยางตอเนอง ในภาวะทเทคโนโลยมการเปลยนแปลงอยางรวดเรว ท าไมบรษทเหลานสามารถผลตคอมพวเตอรรนใหมๆ ไดทนกบความตองการของลกคาไดตลอดเวลา ค าตอบคอบรษทเหลานไมไดเปนผผลตชนสวนคอมพวเตอรทงหมดเอง แตไดซอชนสวนทมอยแลวจากบรษททมชอเสยง เชนซอไมโครโปรเซสเซอรจากบรษท Intel ซอหนวยความจ าส ารองจากบรษท Seagate เปนตน และน าอปกรณตางๆ
44 การเขยนโปรแกรมภาษา Java
ทซอมา ประกอบเปนคอมพวเตอรในนามของบรษทเอง ท าใหสามารถผลตคอมพวเตอรรนใหมไดทนตลอดเวลา ตวอยางทยกมานน แสดงใหเหนถงการท างานโดยยดถอความส าคญของวตถเปนหลก องคประกอบของ OOP แบงเปน 4 สวนคอ
1. Abstraction คอการก าจดขอมลทไมเกยวของทงไป โดยใหเหลอขอมลทตองการเพยงพอตอการแกปญหาเทานน
2. Encapsulation การน า Operation หรอการเขารวมเปนสวนหนงของวตถ เพอซอนรายละเอยดทไมเกยวของ และลดความซบซอนของวตถตอนเวลาน าไปใชงาน
3. Inheritance หมายถงการสรางคลาสใหมจากคลาสเดมทมอยแลวโดยมการถายทอดคณสมบตของคลาสหลกมา
4. Polymorphism การอนญาตตงชอฟงกชนใหซ ากนได แบงเปน 2 ประเภทคอ Overloading และ Overriding
Abstraction และ Encapsulation
Abstraction คอการก าจดขอมลทไมเกยวของทงไปใหเหลอขอมลทตองการเทานน การแทนวตถทมอยในโลกความเปนจรงลงในระบบคอมพวเตอร ตองพจารณาถงคณสมบตทส าคญของวตถเทานน เปนไปไมไดทจะพจารณาคณสมบตทกขอมาของวตถทมอยจรง ตวอยางเชนการแทนคณสมบตของมนษยลงในระบบคอมพวเตอร มนษยมคณสมบตหลายอยางเชน เปนสงมชวต กนอาหารได ขบถายได แตหากมนษยทเปนสมาชกของรานวดโอแหงหนง ขอมลของมนษยทวามนษยเปนสงมชวต หรอ กนอาหารได เปนขอมลทไมเกยวของกบสมาชกของรานวดโอนเลย ขอมลทเกยวของอาจเปน หมายเลขสมาชก ชอ นามสกล อาย รายการหนงทยมไป ยอดคางช าระเปนตน ดงนน Abstraction เปนวธการมองวตถโดยพจารณาวา มคณสมบตใดบางทจะแทนวตถนนโดยพจารณาคณสมบตทเกยวของกบวตถส าหรบในการแกปญหาใดปญหาหนงเทานน
Encapsulation เปนองคประกอบทส าคญอกประการหนงของ OOP ซงหมายถงการน าการปฏบตการ (Operation) รวมเปนสวนหนงของวตถ เหตทเปนเชนนเพราะวาตองการซอนขอมลของวตถไว ผใชงานไมจ าเปนตองทราบถงรายละเอยดตางๆของวตถนน เพยงทราบถงวธการจะใชวตถนนกเพยงพอ ตวอยางเชน การใชงานเครองรบโทรทศน ผใชงานไมจ าเปนตองเขาใจถงวงจรไฟฟาภายในเครองรบโทรทศนวามการท างานอยางไร แตตองเขาใจวาจะเปด ปด หรอเปลยนชอง อยางไรกเพยงพอ ขอดอกประการหนงของ Encapsulation คอท าให การปฏบตการของวตถนนไมสามารถน าไปใชกบวตถอนได ท าใหมความปลอดภยเพมมากขน เชน ผใชงานคงไมอยากใหกญแจควบคมระยะไกลของรถยนตของผอนสามารถเปดประตรถยนตของผใชงานได
วตถ (Object)
เมอกลาวถงค าวาการสรางวตถ มค าถาม 2 ขอทผเขยนโปรแกรมภาษา Java ตองตอบคอ 1) วตถนประกอบดวยอะไร? และ 2) วตถนสามารถท าอะไรไดบาง? ค าวาประกอบดวยอะไร หมายถงคณสมบตของวตถ (Attributes) และท าอะไรบางหมายถงการท างานของวตถ (Methods) ตวอยางเชน ประต คณสมบตของประต คอ ท าจากไม พลาสตก หรอ เหลก รวมถงสของประต สวนการท างานของวตถ คอ สามารถเปดได และปดได ดงนนการออกแบบวตถตองพงค าถาม 2 ขอทกลาวในเบองตน
การเขยนโปรแกรมภาษา Java 45
ภาพท 3.1 ผลไม
ในภาพท 3.1 การออกแบบผลไมโดยค านงถงพลงงานทมในผลไมเทานน ใชหลกการของ Abstraction การก าจดขอมลทไมเกยวของทงไปใหเหลอขอมลทตองการ ดงนนผลไมมคณสมบตคอ น าหนก และ พลงงานตอ 1 กรม สวนการท างานของผลไมคอ การค านวณหาพลงงานทงหมด คณสมบตอนๆ ทไมเกยวของเชน ส รสชาต กลน และ รปราง จะไมน ามาพจารณา ถาน าคณสมบตทไมเกยวของมาพจารณาอาจท าใหการออกแบบวตถผดพลาดจากวตถประสงคทตงไว
คลาส (Class) และวตถ (Object)
กอนการสรางวตถ จ าเปนตองมการออกแบบวตถกอน เชนการสรางบาน สถาปนกตองออกแบบโครงสรางของบานลงบนกระดาษพมพเขยว จากนนวศวกรจงน ากระดาษพมพเขยวไปสรางเปนบาน กระดาษพมพเขยวมเพยงแผนเดยว แตสามารถน าไปสรางบานไดหลายสบหลง ในมมมองของ OOP กระดาษพมพเขยวเปรยบเหมอนคลาส และบานทถกสรางขนเปรยบเหมอนวตถ ดงนนกอนทจะสรางวตถตองมการออกแบบคลาสของวตถนนขนมากอน
จากภาพท 3.2 ตรายาเปรยบไดเปนคลาส และเมอน าตรายางไปกดลงบนกระดาษ รอยพมพทอยบนกระดาษคอวตถ ตรายางนนไมสามารถน าไปใชไดโดยตรง แตรอยพมพสามารถน าไปใชได และตรายางสามารถสรางรอยพมพไดหลายรป หลายส ดงนนตรายางกคอตวอยางทดอนหนงทแสดงใหเหนถงขอแตกตาง ระหวาง คลาส และวตถ
รปท 3.2 ตรายางรปหวใจเปรยบเสมอนคลาส รอยพมพทเกดจากตรายางคอวตถ
ตรายาง
คณสมบต (Attributes) น าหนก (กรม) พลงงานตอ 1 กรม
การท างานของวตถ (Methods) การค านวณจ านวนพลงงานทงหมด
46 การเขยนโปรแกรมภาษา Java
คลาสในภาษา Java เพอแสดงใหเหนถงวธการสรางคลาสในภาษา Java จงขอยกตวอยางของ คลาสของรถยนตดงรปท 3.3
รปท 3.3 การท างาน และคณสมบตของวตถส าหรบคลาสรถยนต คลาสรถยนตประกอบไปดวย ลอ คนเรง และเบรก รถยนตคนนสามารถเดนหนาได และหยดได ขนตอน
แรกของการประกาศ คลาสในภาษา Java ใชค าหลก (Keyword) 2 ค าในการประกาศคอ public class ตามดวยชอของคลาส ดงนนในการประกาศคลาสรถยนตคอ public class Vehicle ค าหลก public คอสวนขยาย (Modifier) ทหมายถงคลาสนเปนคลาสสาธารณะซงคลาสอนสามารถเรยกใชไดโดยไมมขอจ ากด (เรองสวนขยายจะกลาวถงในบทท 4) เมอไดประกาศคลาสแลว ขนตอนตอไปตองสรางคณสมบตและการท างานของคลาสโดยทจะมเครองหมาย “{“ และ “}” แสดงจดเรมตนและสนสดของคลาส เชน
public class Vehicle {
}
ใหสงเกตวาค าหลก public และ class จะตองเปนตวอกษรตวเลกเทานน ในภาษา Java ค าๆ เดยวกน
ขนตนดวยตวอกษรตวใหญ ไมเหมอนกบค าทขนตนดวยอกษรตวเลก (Case-Sensitive) ตวอยางเชน “Vehicle” จะแตกตางจาก “vehicle” เมอน า Source Code นผานตวแปลภาษา จะเกดความผดพลาด ดงนนผเขยนโปรแกรมควรระวงในการตงชอตวแปรตางๆ โดยทวไปชอของคลาสจะนยมตงชอโดยขนตนดวยอกษรตวใหญ
จากภาพท 3.3 สามารถน ามาสรางคลาสรถยนตในภาษา Java โดยลอรถยนตม 4 ลอคอ rightFrontWhell, leftFrontWheel, rightRearWheel และ leftRearWheel เบรกคอ brake สวนคนเรงคอ accelerator
เชนเดยวกบคลาส Vehicle หนา Method run() และ brake() มค าวา public น าหนาเพอตองการให Methods ทง 2 ตวนสามารถเรยกใชงานไดโดยไมมเงอนไข สวน void เปนการก าหนดให Method run() และ brake() ไมตองสงคาใดๆ กลบมา บางครงผเขยนโปรแกรมตองการใหมการสงคากลบมาจาก Method ทเรยกใชงานอย เชน การค านวณหาคาผลลพธของเลขยกก าลงสอง int power(int x) คาท Method power() สงกลบมาคอคาของเลขจ านวนเตม x2 และการสงคากลบตองใชค าสง return แตในบางครงผเขยนโปรแกรมไมตองการใหมการ
คณสมบต (Attributes) Wheels Accelerator pedal Brake pedal
การท างานของวตถ (Methods) Run Break
การเขยนโปรแกรมภาษา Java 47
สงคากลบมาจาก Method กตองใสค าวา void ไวขางหนา Method สวนเครองหมาย “;” จ าเปนตองใสเมอมการจบหนงค าสง ยกเวนในกรณทมเครองหมายขอบเขต “{“ และ “}” ไมจ าเปนตองใสตอทาย
public class Vehicle {
Wheels rightFrontWheel;
Wheels leftFrontWheel;
Wheels rightRearWheel;
Wheels leftRearWheel;
Pedal accelerator, brake;
public void run() {
rightFrontWhell.moveWheelForward();
leftFrontWheel.moveWheelForware();
}
public void brake () {
rightFrontWheel.stop();
leftFrontWheel.stop();
rightRearWheel.stop();
leftRearWheel.stop();
}
}
การสรางวตถ
เมอผเขยนโปรแกรมไดสรางคลาสเรยบรอยแลว คลาสนนไมสามารถน าไปใชงานไดทนท ตองมการสรางวตถจากคลาสนนขนมากอนเหมอนตวอยางตรายางในรปท 3.2 การสรางวตถจะใชค าหลกวา new ดงตวอยาง Vehicle sedan = new Vehicle();
Vehicle truck = new Vehicle();
Vehicle BMW = new Vehicle();
Vehicle sport = new Vehicle();
จากตวอยางจะเหนวารถยนตไมจ าเปนตองมแบบเดยว สามารถเปนไดหลายชนดแตเปนรถยนตเหมอนกน
การเรยกใช Method ในรถยนตสามารถท าไดโดยเรยกชอของวตถกอนแลวตามดวย Method ทตองการโดยคนดวย “.” เชน
sedan.run();
sedan.brake();
BMW.run();
BMW.brake();
Inheritance หรอการถายทอดคณสมบตจากวตถแมสวตถลก
เปนคณสมบตทส าคญของ OOP ขอท 3 หมายถงการสรางคลาสใหมจากคลาสเดม (หรอ คลาสแม) ทมอยแลว และมการถายทอดคณสมบตของคลาสเดมมา (ค าวาคณสมบตรวมถง Method คลาสเดมมดวย) และในคลาสใหมสามารถเพมเตมคณสมบตทไมมในคลาสแมไดดวย จากตวอยางของคลาส Vehicle จะเหนวารถทกคนอยในคลาสเดยวกน รถยนตแตละชนดจะมคณสมบตบางสวนทเหมอนกนเชน มลอทเปนวงกลม การเคลอนทไปขางหนา
Properties
Methods
48 การเขยนโปรแกรมภาษา Java
และการหยดรถ เปนตน แตในความเปนจรงแลวถาเปรยบเทยบรถชนด Sport และ Truck จะเหนความแตกตางบางประการเชน รถชนด Sport สามารถเปดปะทน (Sun Roof) ได และรถชนด Truck สามารถดมพของทบรรทกมาได เชน ทราย หรอดน ดงนน Inheritance เปดโอกาสใหผเขยนโปรแกรมภาษา Java สามารถน าคณสมบตทมอยจากคลาสเดมมาสรางคลาสใหมได และยงสามารถเพมคณสมบตอนๆ ไดอก ดงตวอยาง class Sport extends Vehicle {
SunRoof sunRoof;
public void openSunRoof() {
// ค าสงทใชในการเปดประทน }
} class Truck extends Vehicle {
Thing something;
public Thing dump() {
// ค าสงทใชในการดมพสงของทบรรทกมา }
}
รปท 3.4 แสดงตวอยางโครงสรางของการสบทอดคณสมบตจากคลาสแมสลกของคลาส Vehicle
จากตวอยางคลาส Sport ไดถายทอดคณสมบตมาจากคลาส Vehicle ทกประการ แตไดเพมคณสมบตของ
การเปดปะทนได สวนคลาส Truck ไดถายทอดคณสมบตมาจากคลาส Vehicle เหมอนกนแตเพมคณสมบตของการดมพสงของได ค าหลก extends ใชในการ Inherit คณสมบตจากคลาสแม (Superclass) มาสคลาสลก
HONDA accord
Vehicle
Sedan Truck Sport
Luxury Mid size Compact
Benz S500 BMW series 7
Convertible Non-Convertible
การเขยนโปรแกรมภาษา Java 49
(Subclass) โดยทคลาสลกจะมคณสมบตทคลาสแมมทกประการและยงสามารถเพมเตมคณสมบตอนไดอกเพอใหเหมาะสมส าหรบคลาสลก ภาพท 3.4 แสดงการถายทอดคณสมบตจากคลาสแมสคลาสลก จากคณสมบตของ Inheritance กลาวไดวา รถ Sport และรถ Truck เปน Vehicle ทงค แตรถ Sport ไมใช รถ Truck และ รถ Truck ไมใชรถ Sport ดงตวอยาง
Vehicle vehicle;
Sport Benz;
Truck truck;
vehicle = Benz;
vehicle = truck;
Benz = truck; // Error ไมสามารถ Assign คาไดใหเทากนได คลาสทเปนคลาสแรก (Root Class) ในภาษา Java คอคลาส Object ซงคลาสทกคลาสในภาษา Java
หรอคลาสทผเขยนโปรแกรมสรางขนใหม จะ Inherit มาจากคลาส Object โดยอตโนมต
Polymorphism เปนคณสมบตขอท 4 ของ OOP ค าวา Polymorphism แปลวาสงของทมหลายรปราง ในภาษา Java
หมายถงการอนญาตตงชอฟงกชนซ ากนได Polymorphism ไดแบงออกเปน 2 ประเภทคอ Overloading และ Overriding ส าหรบในภาษา C ชอของฟงกชนไมสามารถตงซ ากนได ตวอยางเชน
/* ภาษา C */ int power(int x);
float power (float x);
แตภาษา Java เปดโอกาสใหผเขยนโปรแกรมสามารถตงชอ Method ใหซ ากนได แตไมอนญาตให
Method ทชอเหมอนกนม Argument แบบเดยวกน สวนประกอบของการเขยน Method แสดงในภาพท 3.5 // ชอ Method เหมอนกน int power(int x);
float power (float x);
// การเรยกใชงาน int a;
float b;
int m=power(a);
float n=power(b);
Benz เปน vehicle Truck เปน vehicle แตรถ Benz ไมใช รถ truck
เมอน าค าสงสวนน ผานตวแปลภาษาจะเกดความผดพลาดขน เนองจากชอของฟงกชนซ ากน ในกรณนคอฟงกชน Power
ถาเปนภาษา Java สามารถตงชอฟงกชนซ ากนได แต Argument ตองไมเหมอนกน
int power(int x) ถกเรยกใชงาน
float power(float x) ถกเรยกใชงาน
50 การเขยนโปรแกรมภาษา Java
รปท 3.5 สวนประกอบของ Method
จากตวอยางขางตน ชอของ Method สามารถซ ากนได แต Argument ไมสามารถซ ากนได โดยตวแปลภาษาจะเลอกวา Method ใดเหมาะสมทสดในการเรยกใชงานเอง ดงนน Method ทมการท างานเหมอนกนแต Argument ทรบเขาส Method ไมเหมอนกน สามารถใชคณสมบตของ Polymorphism ได ในกรณนเรยกวา Overloading ท าใหการเขยนโปรแกรมมความยดหยนแบบ OOP มความยดหยนกวาแบบกระบวนค าสงอยางมาก ตวอยางของ Polymorphism แบบ Overloading คอ Method println() (แสดงวธการใชงานในบทท 1 HelloWorld.java) ในคลาส System.out ซงเปนการแสดงผลลพธทางจอภาพ ตามตวอยาง
void println()
Terminate the current line by writing the line separator string.
void println(boolean x)
Print a boolean and then terminate the line.
void println(char x)
Print a character and then terminate the line.
void println(char[] x)
Print an array of characters and then terminate the line.
void println(double x)
Print a double and then terminate the line.
void println(float x)
Print a float and then terminate the line.
void println(int x)
Print an integer and then terminate the line.
void println(long x)
Print a long and then terminate the line.
ค าสง println() สามารถมชอซ ากนได ทกค าสง Return type เปน void คอไมมการสงคากลบ แต
Argument ของแตละ println() จะแตกตางกน ดงนนผเขยนโปรแกรมสามารถใชค าสง println() ไดกบขอมลทกเกอบประเภทโดยไมตองสนใจประเภทของขอมลทสงให Method println() เชน
long long_number = 100L;
int int_number = 100;
char ch = ‘a’;
System.out.println(long_number);
System.out.println(int_number);
System.out.println(ch);
โปรแกรมเรยนใช println() เหมอนกน แต Argument ตางกน ตวแปลภาษาจะเลอก println() ตวทเหมาะสมท างานเอง
void println(long x)
void println(int x)
void println(char x)
int power (int x);
Return type Method name Argument
การเขยนโปรแกรมภาษา Java 51
Overriding เปน Polymorphism อกชนดหนงซงเกยวของกบการ Inheritance ในกรณทคลาสแมม Method A ทเหมอนกบคลาสลก ถาเรยกใช Method A นจากคลาสลก Method A ในคลาสลกจะท างาน ในทางตรงขามกนถาเรยกใช Method A จากคลาสแม Method A ในคลาสแมจะท างาน แนวคดของ Overriding เหมอนวตถทมอยในความเปนจรง ตวอยางเชน มนษย และปลาวาฬ ตางเปนสตวทมกระดกสนหลง และเปนสตวทเลยงลกดวยนม อยใน Phylum Vertebrate Chordates และใน Class Mammals เหมอนกน มนษยและปลาวาฬตองกนอาหารเพออยรอดเหมอนกน แตวธในการกนอาหารนนตางกน กลาวคอ ปลาวาฬกนสงมชวตพชและสตวทลอยอยในทะเล (Plankton) ตรงขามกบมนษยทกนอาหารทผานการปรงใหสกกอน
public class Mammals {
Energy eat() { // ตองกน และไดพลงงาน }
void breathe() { // หายใจได }
}
class Human extends Mammals {
Energy eat() { // กนโดยปรงใหสกกอน Overriding Method eat() in Mammals} void breathe() { // หายใจทางปอด Overriding Method breathe() in Mammals }
}
class Wheal extends Mammals {
Energy eat() { // กน Plankton ในทะเล Overriding Method eat() in Mammals }
void breathe() { // หายใจทางเหงอก Overriding Method breathe() in Mammals }
}
ตวอยางถดไปเปนการแสดงการใชหลกการของ Polymorphism แบบ Overriding ซงมคลาส Water เปน
คลาสแม และมคลาสลก 2 คลาสคอ IceWater และ MineralWater ซงคลาสลกทงคมการ Overriding Method ทชอ void boil() ของคลาส Water ซงเปนคลาสแม
public class Water { //คลาสน า int temperature;
void boil() {
System.out.println(“Water is boiling”);
}
}
class IceWater extends Water { // น าแขง void boil(){
System.out.println(“Ice water is boiling”);
}
}
class MineralWater extends Water{ // น าแร void boil(){
System.out.println(“Mineral water is boiling”);
}
}
Method Energy eat() ทง 3 เหมอนกน แตในรายละเอยดของ Method eat() ในแตละคลาสจะแตกตางกน
52 การเขยนโปรแกรมภาษา Java
Water water = new Water();
IceWater ice = new IceWater ();
MineralWater mineral = MineralWater ();
water.boil();
ice.boil();
mineral.boil();
จากตวอยางจะเหนวา Water เปนคลาสแม สวน IceWater และ MineralWater เปนคลาสลกซงม Method
การตมน าใหเดอด boil() เหมอนกน ดงนน Method boil() จะท างานตามวตถทเรยกใชงาน ถาเรยกใชงานจากวตถทมาจากคลาสแม จะใช Method boil() จากคลาสแม ท างาน ถาเปนคลาสลก จะใช Method boil() จากคลาสลกท างานแทน
ค าสง new และ Constructor
กอนทจะน าคลาสไปใชงาน จ าเปนตองสรางวตถจากคลาสนนกอนดงทกลาวไวแลว ค าสงทใชในการสรางวตถคอ new ตวอยางเชน
Book cartoon; cartoon = new Book();
เครองคอมพวเตอรจะสรางวตถ Book ขนในหนวยความจ า และใหตวแปร cartoon ชไปทหนวยความจ า
นนดงภาพท 3.6
ภาพท 3.6 การสรางวตถ cartoon
cartoon เ ป น เ พ ย ง ต ว ช ไ ป ท ว ต ถ ท ส ร า ง ข น เ ท า น น ด ง น น ถ า ป ร ะ ก า ศต ว แ ป ร Book cartoon ตวแปร cartoon ยงไมสามารถน ามาใชได เนองจากตวแปรนจะมคาเปน null หรอยงไมมคา และเมอใชค าสง new เพอจองพนทในหนวยความจ าเพอสรางวตถจรง แลวจงใหตวแปร cartoon ชไปทวตถนน ดงภาพท 3.6 ส าหรบการสรางตวชนด Primitive เชน int, long, double หรอ char ไมตองใชค าสง new เพอจองพนท เนองจากตวแปลภาษา Java จะท าหนาทในการจองพนทในหนวยความจ าใหอตโนมต
แสดงประโยค “Mineral water is boiling”
แสดงประโยค”Ice water is boiling”
แสดงประโยค “Water is boiling”
cartoon
Book cartoon
Book cartoon;
cartoon = new Book();
null
การเขยนโปรแกรมภาษา Java 53
เนองจากหนงคลาสอาจประกอบดวยตวแปรชนด Primitive และ Reference จ านวนมาก เมอมการสรางวตถจากคลาสน ตวแปรเหลานจะมคาทไมสมบรณ การน าวตถนไปใชงาน อาจสงผลใหการท างานนนผดพลาดได ดงนน การสรางวตถขนครงแรก ผเขยนโปรแกรมภาษา Java สามารถก าหนดคาเรมตนใหกบวตถนน ในภาษา Java ม Constructor ซงเปน Method แรกทถกเรยกใชงานอตโนมตเมอมการสรางวตถขน ดงนนผเขยนโปรแกรมภาษา Java สามารถใช Constructor ในการก าหนดคาเรมตนใหกบวตถได รปแบบการเขยน Constructor คอ
Classname (Arguments) { . . . }
ตวอยางขางลางแสดงการเขยน Constructor ของคลาส Book โดยมทงหมด 4 Constructors โดยแตละ
Constructor แสดงการตงคาใหตวแปรของคลาส Book จาก Argument ทไดรบมา จากตวอยาง Constructor เปน Method ในคลาสซงตองตงชอใหเหมอนกบชอของคลาสเทานน ดงตวอยาง Book(String lang) ในหนงคลาสอาจมไดหลาย Constructor แตจะรบ Argument ทไมเหมอนกน (ใชหลกการของ Overloading) และตองไมมการสงคากลบ
Book cartoon = new Book();
Book cartoon = new Book(“English”);
Book magazine = new Book(“Car racing”, “Thai”);
Book textbook = new Book(“Java Programming”, “A. Thirapon”, “Bangkok University”);
public class Book {
String title;
String language;
String author;
String publisher;
// Constructor แบบ Default คอไมมการสง Argument ไปให Book() { title = “none”; language = “none”; author = “none”, publisher = “none”;
}
// Constructor ทรบ Argument เปน String
Book (String lang) {
title = “none”; language = lang; author = “none”; publisher = ”none”;
}
// Constructor ทรบ Argument เปน String 2 คา Book (String x, String y) { title = x; language = y; author = “none”; publisher = ”none”;
}
//Constructor ทรบ Argument เปน String 3 คา Book (String x, String y, String z) {
title = x; language = “none”; author = y; publisher = z;
}
}
54 การเขยนโปรแกรมภาษา Java
ตวอยางโปรแกรมการเขยนโปรแกรมในภาษา Java การยกตวอยางโปรแกรมในภาษา Java เพอใหผอานสามารถน าหลกการของ OOP ทกลาวไปแลว มาประยกตใชในการเขยนโปรแกรมได โปรแกรมแรกเปนโปรแกรมการบวกตวเลข Add.java โปรแกรมทสอง Circle.java ซงแสดงการค านวณหาคาเสนรอบวงของวงกลม และโปรแกรมทสาม TestObject.java แสดงการสรางวตถ public class Add {
public static void main(String[] args) {
System.out.println("This program will show result of adding 2 numbers");
int a = 5;
int b = 10;
int result = a + b;
System.out.println("The result is: " + result);
}
}
---------- Java output ----------
This program will show result of adding 2 numbers
The result is: 15
การท างานของโปรแกรม Add.java เรมดวยการสรางคลาส Add ประกอบดวย Method main() ซงเปนจดเรมตนการท างาน ค าสง System.out.println() เปนค าสงทใชในการพมพขอความทางจอภาพ และมการประกาศตวแปร 3 ตวแปรคอ int a = 5;
int b = 10;
int result = a + b;
ค าหลก int ใชในการประกาศตวแปรทเปนจ านวนเตม ในตวอยาง ตวแปร a เปนชนดจ านวนเตมโดยมคาเปน 5 ส าหรบตวแปร b มคาเปน 10 สวนตวแปร result เปนผลบวกของ a และ b โดยสงเกตวาทกค าสงตองใสเครองหมาย “;” เพอเปนการจบค าสงทกครง และใน 1 บรรทดสามารถเขยนค าสงไดมากกวา 1 ค าสง แตตองคนค าสงดวยเครองหมาย “;” เชน int a = 5; int b = 10; int result = a + b;
จากตวอยางค าสงการประกาศตวแปรทง 3 ค าสงสามารถอยในบรรทดเดยวกนได และใหผลลพธทเหมอนกน สวนค าสง System.out.println("The result is: " + result);
การเขยนโปรแกรมภาษา Java 55
เปนการพมพขอความ “The result is:” และตามดวยเครองหมาย + result เปนการสงใหพมพขอความ “The result is:” และคาของตวแปร result ทางจอภาพ สงเกตวาการพมพคาของตวแปรไมตองใสเครองหมายค าพด สวนเครองหมาย + ใชในการเชอมขอความใหตอเนองกน เชน System.out.println(“Hello, ” + “ How are you?”);
ผลลพธทไดคอ Hello, How are you? โปรแกรมทสอง Circle.java แสดงการค านวณหาเสนรอบวงของวงกลม ซงใชคลาส Math ใน Package
java.lang (เรอง Package อธบายในบทท 4) ระบคาคงทของ ได public class Circle {
public static void main(String[] args) {
System.out.println("This will show value of perimeter of a circle");
System.out.println("A circle has a radius of 4");
System.out.println("The perimeter of the circle is " + 2*Math.PI*4);
}
}
---------- Java Output----------
This will show value of perimeter of a circle
A circle has a radius of 4
The perimeter of the circle is 25.132741228718345
โปรแกรมทสาม TestObject.java จ าลองการเกบขอมลทวไปของนกศกษาในมหาวทยาลยแหงหนง ซงแสดงการสรางวตถจากคลาสกอนน าไปใชงานซงแตกตางจากตวอยางแรกทไมมการสรางวตถ
ภาพท 3.7 คลาส TestObject และคลาส Student
Class Student Attributes: ID name grade Method: getID() changeID() getName() changeName() getGrade() setGrade()
Class TestObject Method: main()
56 การเขยนโปรแกรมภาษา Java
คลาส Student ม Attributes 3 ตวแปรคอ ID, name และ grade โดยทผเขยนโปรแกรมภาษาจากตองสราง Method ทใชในการอานและเขยนตวแปรเหลานดวย ดงนนในคลาส Student จะม Method ทใชในการอานและเขยนคาตวแปรของคลาสทงสน 6 Methods ดงตอไปน String getID();
ใชในการอานคารหสของนกศกษา ซง Method นมการสงคา String หรอขอความตวอกษรทเปนรหสนกศกษากลบใหเมอมการเรยกใชค าสงน void setID(String IDin);
ใชในการเปลยนคารหสของนกศกษาโดยระบคาทตองการเปลยนเปน String IDin และ Method ท างานโดยใหคาของตวแปร ID ในวตถ Student มคาเทากบ IDin ทรบเขามา String getName();
ใชในการอานชอของนกศกษา Method นมการสงคา String หรอขอความตวอกษรทเปนชอนกศกษากลบมากใหเมอมการเรยกใชค าสงน void setName(String nameIn);
เปน Method ทใชในการเปลยนชอของนกศกษาโดยระบคาทตองการเปลยนเปน String nameIn และ Method ท างานโดยใหคาของตวแปร name ในวตถ Student มคาเทากบ nameIn ทรบเขามา
String getGrade();
เปน Method ทใชในการอานคาเกรดจากนกศกษา Method นมการสงคา String หรอขอความตวอกษรทเปนเกรดของนกศกษากลบมากใหเมอมการเรยกใชค าสงน void setGrade(String gradeIn);
เปน Method ทใชในการตงคาเกรดของนกศกษาโดยระบคาทตองการเปลยนเปน String gradeIn และ Method ท างานโดยใหคาของตวแปร grade ในวตถ Student มคาเทากบ gradeIn ทรบเขามา
จากรป 3.7 น ามาสรางเปนคลาส Student ในภาษา Java ไดดงตวอยางขางลาง ในคลาส Student ม 2
Constructors คอ Default Constructor และ Constructor ทรบ Argument เปน รหสนกศกษา และชอของนกศกษา public class Student {
String ID;
String name;
String grade;
// 1. Default Constructor public Student() { ID = "No id";
name = "No name";
}
การเขยนโปรแกรมภาษา Java 57
// 2. Constructor ทรบขอมลเปน รหส และ ชอนกศกษา public Student(String IDin, String nameIn) {
ID = IDin;
name = nameIn;
}
/* Method ทง 6 เปนเปนการอานและเขยนคาใหตวแปรของคลาส Student String getID() {
return ID;
}
void setID(String IDin){
ID = IDin;
}
String getName() {
return name;
}
void setName(String nameIn) {
name = nameIn;
}
String getGrade() {
return grade;
}
void setGrade(String gradeIn) {
grade = gradeIn;
}
}
คลาส Student เปนคลาสทไมไดเปนคลาสทเรมท างานเปนอนดบแรก เนองจากในคลานส Student ไมม Method main() ซงเปนจดเรมตนของโปรแกรม ส าหรบคลาส TestObject นนเปนคลาสทเรมท างานเปนล าดบแรกเนองจากม Method public static void main() ใน Method น มการสรางวตถ Student ขนโดยใชค าสง new เมอวตถ Student ถกสรางแลว ผเขยนโปรแกรมสามารถเรยกใชงาน Method ตางๆ ในวตถ Student ไดดงตวอยาง public class TestObject {
public static void main(String[] args) {
Student st1 = new Student(“111”, “Somchai”);
Student st2 = new Student(“222”, “Wisut”);
// ตงคา grade ส าหรบวตถ st1 และ st2 st1.setGrade(“A”);
st2.setGrade(“B+”);
// แสดงคา grade ของวตถ st1 และ st2 ทตงคากอนหนาน System.out.println(st1.getName() + “ got ” + st1.getGrade() );
System.out.println(st2.getName() + “ got ” + st2.getGrade() );
58 การเขยนโปรแกรมภาษา Java
// ตงคาและแสดงคา Sunee ใหกบวตถ st1 st1.setName(“Sunee”);
System.out.println(st1.getName() + “ got ” + st1.getGrade() );
}
}
---------- Java Output----------
Somchai got A
Wisut got B+
Sunee got A
จากตวอยางทยกมา สงเกตไดวาคลาส Student ไมสามารถท างานไดดวยตวเอง แตตองอาศยคลาส TestObject เปนโปรแกรมเปนโปรแกรมหลกทท างาน และในคลาส TestObject มการสรางวตถจากคลาส Student และมการเรยกใชงานวตถน การสงคาให Method
การสงคาใหกบ Method ทเรยกใชงาน สามารถท าได 2 วธคอ การสงคาตวแปรชนด Primitive หรอ Pass-by-Value และการสงคาตวแปรชนด Reference หรอ Pass-by-Reference ในโปรแกรม PassByValue.java แสดงการท างานของการสงคาชนด Primitive ใหกบ Method print_i()
public class PassByValue {
public static void main(String[] args) {
int i = 90;
print_i(i);
System.out.println(“Print value of i in method main() = ” +i);
}
public static void print_i (int i) {
i += 10;
System.out.println(“Print value of i in method print_i() = ” +i);
}
}
---------- Java Output----------
Print value of i in method print_i() = 100
Print value of i in method main() = 90
จากตวอยางโปรแกรม PassByValue.java เมอสงคา i ใหกบ Method print_i(i) แลวใน Method print_i(i)
นจะสรางส าเนาของคา i เพอใชภายใน Method print_i(i) เทานน เมอจบการท างานคา i ใน Method print_i(i) จะถกท าลายลง และคา i ใน Method main() ไมมการเปลยนแปลง ดภาพท 3.8 ประกอบ
การเขยนโปรแกรมภาษา Java 59
ภาพท 3.8 แสดงการการท างานของ Pass-by-Value
โปรแกรม PassByRef.java แสดงการสงคาตวแปรทเปนวตถ การสงคาตวแปรทเปนวตถใหกบ Method
เปนแบบ Pass-by-Reference คอ ถามการเปลยนคาตวแปรใน Method ทถกเรยนใชน มผลท าใหตวแปรใน Method หลกเปลยนคาดวย
เมอมการสงคาตวแปรแบบวตถ (Pointer) ใหกบ Method ตวแปรนนจะถกท าส าเนาเชนกน แตไมมการสรางวตถใหมภายใน Method แตตวแปรใน Method หลกและใน Method ทถกเรยกใชงานจะชไปทวตถในต าแหนงเดยวกน class Student{
String name;
int ID;
public Student (String n, int id){ // Constructor name = n;
ID = id;
}
public void printStudent() {
System.out.println(“Name is ” + name);
System.out.println(“Student ID is ” + ID);
}
}
public class PassByRef {
public static void main(String[] args) {
Student myStudent = new Student(“Somchai”, 142222222);
changeStudentName(myStudent, “Pimda”);
System.out.println(“In main()” );
myStudent.printStudent();
}
public static void main(String[] args) { int i = 90; print_i(i); … }
public static void print_i(int i) { i += 10; }
90
i in memory X
90 + 10
Copy of i in memory Y
call Copy value of 90 to a new location of memory Y
60 การเขยนโปรแกรมภาษา Java
public static void changeStudentName(Student st, String name) {
st.name = name;
System.out.println(“In changeStudentName Method”);
st.printStudent();
}
}
---------- Java Output----------
In changeStudentName Method
Name is Pimda
Student ID is 142222222
In main()
Name is Pimda
Student ID is 142222222
จากตวอยางโปรแกรม PassByRef.java ใน Method main() มการสรางตวแปร myStudent ซงชไปทวตถ
Student และมการเรยกใช Method changeStudentName() เพอเปลยนชอของนกศกษาจาก “Somchai” เปน “Pimda” โดยสงตวแปร myStudent ใหกบ Method changeStudentName() เมอ Method ยอยรบตวแปร myStudent มาแลว จงท าส าเนาของตวแปร myStudent และตงชอเปน st ดงนนท าใหตวแปรทงสองชไปทวตถ Student เหมอนกน ถามการแกไขคา name ของตวแปร st ใน Method chageStudentName() จะท าใหคา name ในตวแปร myStudent ทอยใน Method main() เปลยนตามไปดวย ดภาพท 3.9 ประกอบความเขาใจ
ภาพท 3.9 แสดงการการท างานของ Pass-by-Reference
public static void main(String[] args) { Student myStudent = new Student("Somchai", 142222222); changeStudentName(myStudent, "Pimda"); }
void changeStudentName(Student st, String name) { st.name = name; }
st
call
myStudent
“Somchai” 142222222
การเขยนโปรแกรมภาษา Java 61
ขอบเขตการใชงานของตวแปร การประกาศตวแปรตางสถานทมผลโดยตรงกบการคงอยและขอบเขตทจะเรยกใชตวแปรเหลาน การ
ประกาศตวแปรในต าแหนงทตางกน ขอบเขตการใชงานของตวแปรแบงเปน 3 ประเภทคอ 1. Member Variable 2. Method Variable 3. Local Variable
public class ScopeVariable {
// x เปน Member Variables int x;
// y เปน Method Variable
Method (int y) {
// i เปน Local Variable for(int i = 0; i< 100; i++){
// do something
}
System.out.println(i); // Error at Compiling }
}
ตวแปร x เปน Member Variable ซงสามารถเรยกใชไดทกทภายในคลาส ScopeVariable ส าหรบตวแปร
y เปน Method Variable ซงสามารถเรยกใชไดภายใน Method เทานน ไมสามารถอางถงตวแปร y ภายนอก Method ได สดทายตวแปร i เปน Local Variable ซงเรยกใชไดภายใน for Loop เทานน เมอสนสด for Loop ตวแปร i จะถกยกเลกไป ท าใหค าสงสดทาย System.out.println(i) นนผดเพราะไมสามารถอางถงคาของ i ไดอก เนองจากตวแปร i เปน Local Variable ดงนนต าแหนงทมการประกาศตวแปรจะท าใหขอบเขตของการเรยกใชงานตวแปรมขอจ ากดดงกลาวดวย
การเขยน Java Documentation ในอดต เอกสารทใชในการอธบายการเรยกใชงานโปรแกรมส าหรบผใชงาน (Application Programming Interface: API) จะถกแยกออกมาจากสวนของโปรแกรม และการท าเอกสารน ตองใชโปรแกรมสรางเอกสารทวไป เชน Notepad หรอ Microsoft Word ท าใหการจดการเอกสารและโปรแกรมมความยงยากและซบซอน ดงนนในภาษา Java ไดใชหลกใหมส าหรบการสรางเอกสารอธบายการเรยกใชงานโปรแกรมทสรางขน โดยใหผเขยนโปรแกรมภาษา Java สามารถสรางค าอธบายโปรแกรมไปพรอมกบการเขยนโปรแกรมไดเลยในแฟมขอมลทเปน Source Code เดยวกน วธนท าใหการจดการเอกสารนนมความงายและมประสทธภาพมากขน โปรแกรม Fruit.java (สรางขนโดยใชตวอยางในภาพท 3.1) แสดงการใช Java Documentation หรอ Javadoc Comment ใน
62 การเขยนโปรแกรมภาษา Java
การอธบายการท างานของคลาส Fruit ในโปรแกรมทแสดงน Javadoc comment คอ สวนค าอธบายทอยระหวางเครองหมาย /** และเครองหมาย */ และเมอขนบรรทดใหม ตองมเครองหมาย * น าหนาทกบรรทดดวย ดงตวอยาง /**
* This is Javadoc comment. This comment is used with Javadoc program.
* Fruit class has 2 properties, 1 constructor, and 1 method.
*Javadoc will generate HTML files with this comment.
* @version 1.0
* @author Thirapon Wongsaardsakul */
public class Fruit {
private int weight, calorie;
/** This constructor will create a new object Fruit with assigned parameters.
* @param w weight of this fruit.
* @param cal how much calorie this fruit has per 1 gram.
*/
public Fruit (int w, int cal) {
weight = w;
calorie = cal;
}
/**
* This method will find total calories of the fruit
* @return the value of total calories
*/
public int total_cal () {
return weight * calorie;
}
} // End of Fruit Class ในสวนของโปรแกรมคลาส Fruit มการแทรก Javadoc Comment แสดงในแถบสทเขมกวา ซงอธบาย
โปรแกรมวาท าหนาทอะไร รบ Argument แบบใดบาง และมการสงคากลบคอเปนแบบใด จากตวอยาง คลาส Fruit มคณสมบต 2 สวนคอ น าหนก (Weight) และ คาพลงงาน (หนวยเปน Calorie) ตอ 1 กรม และม Constructor เพอรบขอมลน าหนกและคาพลงงาน สวน Method total_cal() จะค านวณหาคาของพลงงานทงหมดทม โปรแกรม TestFruit แสดงการใชงานคลาส Fruit
public class TestFruit {
public static void main(String[] args) {
// เรยก constructor โดยตงคา weight = 10 และ calorie = 50
Fruit f = new Fruit(10, 50);
การเขยนโปรแกรมภาษา Java 63
// แสดงคา weight * calorie
System.out.println( f.total_cal() );
} }
การเขยน Comment โดยใช Javadoc จะตองแทรกค าอธบายกอนคลาส หรอกอน Method ดงรปท 3.10
ภาพท 3.10 แสดงต าแหนงการแทรก Javadoc Comment
ในรปท 3.11 แสดงขนตอนการสรางเอกสาร HTML จาก Fruit.java โดยใช Javadoc Utility เพอตรวจสอบ
ความถกตองของ Comment และสราง HTML ขน การเรยกค าสง Javadoc มรปแบบดงตอไปน Javadoc [option] file
ตวอยางในการสราง Javadoc จากโปรแกรม Fruit.java Javadoc –version –author –d doc Fruit.java
ถาใชคา option เปน –version –author และ –d (-d ตามดวยชอของโฟลเดอร) มหมายความวาให
Javadoc สรางแฟมขอมล HTML โดยระบเวอรชนของโปรแกรม และชอของผเขยนโปรแกรม ลงในโฟลเดอรชอ doc พจารณาโปรแกรมคลาส Fruit จะมค าหลกทใชกบ Javadoc เชน @version, @author, @param, และ @return อธบายไวในตารางท 3.1 ซงค าหลกทยกตวอยางเปนเพยงค าหลกบางสวนเทานน ผอานสามารถอานเพมเตมเรองของค าหลกใน Javadoc และค าหลกอนๆ ไดใน Java Document ซง Download ไดจาก http://www.oracle.com
ตารางท 3.1 แสดงความหมายของค าหลกใน Javadoc
ค าหลก ค าอธบาย @version ตามดวยเวอรชนของโปรแกรม เชน
@version 1.1 ค าหลกนจะใชกอนการประกาศคลาสดงรป 3.2
@author ตามดวยชอของผเขยนโปรแกรม เชน
Class Comment public class Fruit { Constructor Comment public Fruit (..) {…} Method Comment public int total_cal(){ …} }
แทรก Javadoc Comment ดงต าแหนงตอไปน คอ กอนคลาส กอน Constructor และ กอน Method
64 การเขยนโปรแกรมภาษา Java
ค าหลก ค าอธบาย @author Thirapon Wongsaardsakul ค าหลกนจะใชกอนการประกาศคลาสดงรป 3.2
@param ใชกบ Constructor หรอ Method เพอบอกรายละเอยดของ Parameter ตางๆ เชน /** This function will add 2 values * @param a the first value * @param b the second value */ int add (int a, int b);
@return ใชกบ Method เพอบอกรายละเอยดของคาทสงกลบ ค าหลก @return ไมสามารถใชกบ Constructor ไดเนองจาก Constructor จะไมมการสงคากลบ ตวอยางการใชเชน * @return the value of total calories
ภาพท 3.11 แสดงขนตอนการสราง HTML comment โดยโปรแกรม Javadoc
1. สรางแฟมขอมล Fruit และ TestFruit ดงตวอยาง
2. สรางโฟลเดอร doc ส าหรบใชเกบ Document ทเกดจาก Javadoc
3. ใช Javadoc เพอสราง HTLML comment ไวในโฟลเดอร doc
การเขยนโปรแกรมภาษา Java 65
Javadoc แสดงคาของ Parameter ในกรณท Parameter นเปน public เทานน และจะไมแสดงคาของ Parameter ในกรณทเปน private อยางไรกตาม ถาตองการให Javadoc แสดงคาของ Field ทเปน private ดวย จ าเปนตองใชค าสงดงตอไปน
Javadoc –private –author –version –d doc Fruit.java
ในภาพท 3.12 แสดงผลลพธทเปน HTML ของคลาส Fruit ทโปรแกรม Javadoc สรางขน โดยใช Internet
Explorer เปดแฟมขอมล index.html ในโฟลเดอร doc
ภาพท 3.12 แสดงผลลพธทเปน HTML โดยใช Javadoc Utility
Unified Modeling Language (UML) UML คอโมเดลทใชในกระบวนการออกแบบ Object-Oriented Software เมอกลาวถงค าวาโมเดล ผอานอาจนกถงรปแบบจ าลองตางๆ เชน รปแบบจ าลองรถยนต เครองบน หรอหนยนต ทเคยเลนตอนเปนเดก อนทจรงแลววตถประสงคหลกของการสรางโมเดลนนคอ การทดสอบวาสงทออกแบบมาบนกระดาษจะสามารถน ามาสราง
66 การเขยนโปรแกรมภาษา Java
+Fruit(in w : int, in cal : int)
+total_cal() : int
-weight : int
-calorie : int
Fruit
เปนวตถจรงและท างานไดหรอไม โดยมคาใชจายนอยทสด ตวอยางการใชโมเดล คอการสรางเครองบน วศวกรการบนจะมการสรางโมเดลซงราคาไมแพงเพอทดสอบการท างาน เชนสรางโครงเครองบนขนาดยอสวน เพอในไปทดสอบในอโมงลม ในกรณททดสอบดวยโมเดลแลวปรากฎวาโมเดลนท างานไดไมถกตอง กไมมความจ าเปนทตองไปสรางวตถจรงเพอทดสอบอก และโมเดลทวไปจะมาราคาทถกมากเมอเทยบกบอปกรณจรง เชนเดยวกบโมเดล UML ซงเปนโมเดลทใชในการทดสอบวาคลาสตางๆ ทออกแบบมานนมความเปนไปไดวาจะท างานไดจรง โดยไมจ าเปนตองไปเขยนโปรแกรมจรงเพอทดสอบ ใหพจารณาวาในการพฒนาระบบซอฟตแวรทมขนาดใหญ ตวซอฟตแวรอาจประกอบดวยคลาสจ านวนเปนรอยคลาส ดงนนถาไมมการออกแบบทด และใหผเขยนโปรแกรมเรมเขยนโปรแกรมทนท อาจสงผลใหซอฟตแวรนท างานไมส าเรจ วตถประสงคของการใช UML นนเพอใชในการออกแบบระบบซอฟตแวรขนาดกลางถงใหญ และเพอเปนสอเพอใหผเขยนโปรแกรมสามารถสอสารความคดของตนเองใหเพอนทเปนผพฒนาซอฟตแวรไดอยางมประสทธภาพ
ในชวงป 1990 James Rumbaugh, Grady Booch และ Ivar Jacobson ไดพฒนาภาษา UML ขนโดยการน าเอาขอดของ Modeling Language ของทงสามคนทเคยพฒนาไวแลว มารวมกนเปนหนงเดยวกน (Unified) เพอสราง Modeling Language ทดทสดส าหรบการพฒนาซอฟตแวร ในการพฒนาซอฟตแวรเชงวตถ ขนตอนทใชเวลามากทสดคอขนตอนการออกแบบ ซงผออกแบบจะตองระดมความคดในการออกแบบคลาสตางๆ ทจ าเปนตอการสรางซอฟตแวร ดงนนการใชภาพวาดแทนรปคลาส จะเปนสวนทชวยใหทมงานพฒนาซอฟตแวรเขาใจระบบไดงายขนมากกวาการใชขอความทเปนเปนตวอกษรอยางเดยว ภาพทวาดแทนคลาสตางๆ ในขนตอนการออกแบบจะตองสอความหมายทเปนมาตรฐานเพอใหทกคนในทมพฒนาซอฟตแวรเขาใจไดตรงกน UML จะเปนเครองมอมาตรฐานทสามารถชวยในการพฒนาซอฟตแวรเชงวตถไดนนเอง UML ประกอบดวยรปภาพและ Diagram จ านวนมาก ซงรายละเอยดของ UML ทงหมดนนเกนเนอหาและวตถประสงคของหนงสอเลมน ดงนนจงขอกลาวถง UML ในสวนของ Class Diagram เบองตนเทานน (การอธบายคลาสในเชงรปภาพ) ซงเปนหนง Diagram ใน UML เทานน ผอานสามารถศกษา UML เพมเตมไดท http://www.uml.org รปแบบการเขยนคลาสใน UML แสดงในภาพท 3.13
ภาพท 3.13 แสดงภาพ Class Diagram ของ Fruit รปภาพของ Class Diagram แบงเปน 3 สวนคอ 1) Class Name 2) Attribute และ 3) Method ในสวนของ Attribute มเครองหมาย Access Modes ทงหมด 3 แบบคอ
เครองหมาย – คอ private
Class Name
Attributes
Method
การเขยนโปรแกรมภาษา Java 67
เครองหมาย + คอ public เครองหมาย # คอ protected
สวนท 3 ของ Class Diagram คอ Method ซงแสดงคา Parameter ทรบเขาส Method ดวย ดงภาพ 3.13 Constructor Fruit(in w : int, in cal : int) หมายถง การรบ Parameter w ซงเปนชนดตวเลขจ านวนเตม และ Paramter cal ซงเปนตวเลขจ านวนเตมเชนเดยวกน แตไมมการสงคากลบ ส าหรบ Method total_cal() : int เปน Method ทไมรบ Parameter แตมการสงคากลบเปนตวเลขจ านวนเตม
ภาพท 3.14 แสดงภาพ Class Diagram ของ MyDate
จากภาพท 3.14 แสดง Class Diagram และโปรแกรม MyDate ซงประกอบดวย 3 Attributes คอ day, month และ year ซงเปนสอง Attributes แรกเปนชนด public สวนตวแปร year เปนชนด private ตามเครองหมายบวกและลบ และวธการสรางวตถ MyDate ใชค าสง new ดงทกลาวไปแลว
รปท 3.15 แสดงวธการสรางวตถ MyDate
ในโปรแกรม TestMyDate.java ดงภาพท 3.15 มการใชค าสง new MyDate() เพอใหเครองคอมพวเตอรจองหนวยความจ าใหกบตวแปร myDate สวนเสนปะจาก TestMyDate ไปท MyDate ใน Class Diagram แสดง
+day : int
+month : int
-year : int
MyDate public class MyDate {
public int day;
public int month;
private int year;
}
+day : int
+month : int
-year : int
MyDate
+main()
TestMyDate
public class TestMyDate{
public static void main(String[] args) {
MyDate myDate = new MyDate();
}
}
public class MyDate {
public int day;
public int month;
private int year;
}
myDate
day month year
ตวแปร
วตถ MyDate
68 การเขยนโปรแกรมภาษา Java
ความสมพนธระหวางคลาส TestMyDate และคลาส MyDate แบบ Dependency หมายถงคลาส TestMyDate มการเรยกใชงานวตถของ MyDate ส าหรบการเรยนเขยนโปรแกรมเชงวตถเบองตน ผอานสามารถใชเครองมอทชอ BlueJ: The Interactive Java Environment ดาวนโหลดไดท http://www.bluej.org เครองมอนเหมาะส าหรบผเรยนเขยนโปรแกรมเชงวตถ เนองจากมภาพแสดงวตถทถกสรางขน ผเขยนโปรแกรมสามารถทดสอบความถกตองของวตถทถกสรางขน และผเขยนโปรแกรมยงสามารถสงใหวตถท างานทละค าสงเปนล าดบ (Debugging) เพอดคาตวแปรตางๆ ไดอก เมอน าโปรแกรม TestMyDate.java และ MyDate.java มาสรางใน BlueJ จะไดผลลพธดงภาพท 3.16
ภาพท 3.16 ภาพแสดงความสมพนธแบบ Dependency ระหวาง TestMyDate และ MyDate ในโปรแกรม BlueJ
ส าหรบการเขาถงตวแปรในวตถ myDate ท าไดโดยเขยนชอวตถ ตามดวยจดและชอตวแปรของวตถนน เชน myDate.day หมายถงการอางตวแปร day ในวตถ myDate แตมขอแมวาตวแปร day ตองเปนชนด public เพอใหสามารถอางถงได ดงตวอยาง public class TestMyDate{
public static void main(String[] args) {
MyDate myDate = new MyDate();
myDate.day = 5;
myDate.month = 6;
System.out.println("Today is " + myDate.day + "/" + myDate.month);
}
}
จากรปท 3.17 แสดงการตงคา day ใหเทากบ 5 และ month ใหเทากบ 16 ซงในความเปนจรง คาเดอนม
คาได 1 ถง 12 เทานน การทก าหนดใหตวแปรของคลาสเปนชนด public สงผลใหคลาสอนสามารถเขาใชตวแปรนนไดโดยไมมเงอนไข ซงอาจท าใหการใชงานตวแปรนนไมถกตอง ดงนนตวแปรของคลาสควรเปน private เพอ
อางถงตวแปรของวตถ myDate
การเขยนโปรแกรมภาษา Java 69
ปองกนไมใหคลาสอนเขาถงตวแปรนได แตคลาสอนสามารถใชตวแปรนได โดยผาน Method ของคลาสเทานน ดงนนควรแกไขชนดตวแปรของคลาส MyDate ใหเปนแบบ private ทงหมด ซงถกตองตามหลกการของ OOP: Encapsulation
รปท 3.17 แสดงวธการเขาถงตวแปร month ของวตถ myDate ถาตวแปรของคลาสเปน private แลว การเขาใชตวแปรของวตถ จะไมสามารถท าไดโดยตรง โปรแกรมตอไปแสดงการเขาถงตวแปรชนด private โดยตรง ซงเมอน าโปรแกรมน ผานตวแปรภาษา จะเกดขอผดพลาดขน
public class TestMyDate {
public static void main(String[] args) {
MyDate myDate = new MyDate();
myDate.day = 5;
myDate.month = 16;
System.out.println("Today is " + myDate.day + "/" +
myDate.month + "/" + myDate.year);
}
}
+day : int
+month : int
-year : int
MyDate
+main()
TestMyDate
public class MyDate
{
public int day;
public int month;
private int year;
}
public class TestMyDate{
public static void main(String[] args) {
MyDate myDate = new MyDate();
myDate.day = 5;
myDate.month = 16;
System.out.println("Today is " + myDate.day + "/" + myDate.month);
}
}
ผดพลาดเมอน าไป Code นผานตวแปลภาษา Java เนองจากไมสามารถเขาถงตวแปรแบบ private ได
ตามหลกการของ Encapsulation ควรใหตวแปรของคลาสเปนชนด private เทานน
month ไมสามารถเปนคา 16 ได
70 การเขยนโปรแกรมภาษา Java
รปท 3.18 แสดงภาพ Class Diagram โดยเปลยนใหตวแปรของคลาส MyDate เปน private ทงหมด จากรปท 3.18 เมอก าหนดใหตวแปรของคลาส MyDate เปน private ทงหมด ท าใหตองสราง public Method ทใชในการตงคาตวแปรของคลาสขน เนองจากไมสามารถเขาถงตวแปรไดโดยตรง (ตามหลกการของ OOP เรอง Encapsulation ดงทกลาวไปแลวในชวงตนบท) สวนวธการเขาถงตวแปร private ท าไดโดยผาน Method ทเปน Public เชน myDate.setDay(1) เปนตน ส าหรบการอานคาตวแปรของคลาส MyDate สามารถท าไดโดยผาน Method ของคลาสทเปน Public ไดเชนเดยวกน ซงเพม Method ตางๆ ทใชในการอานตวแปรของคลาสทเปน private ดงนน Methods ทใชในการอานและเขยนคาใหกบตวแปร day, month และ year ของวตถ MyDate มดงน
public void setDay(int d) public void setMonth(int m) public void setYear(int y) public int getDay() public int getMonth() public int getYear()
ในภาพท 3.19 แสดงการสราง Methods ของคลาส MyDate เพอใชในการอานและเขยนคาตวแปรชนด
Private ของคลาส
+setDay(in d : int)
+setMonth(in m : int)
+setYear(in y : int)
-day : int
-month : int
-year : int
MyDate
+main()
TestMyDate
public class MyDate{
private int day;
private int month;
private int year;
public void setDay(int d) {
day = d;
}
public void setMonth(int m) {
month = m;
}
public void setYear(int y) {
year = y;
}
}
public class TestMyDate{
public static void main(String[] args) {
MyDate myDate = new MyDate();
myDate.setDay(1);
myDate.setMonth(6);
myDate.setYear(2004);
}
}
การเขยนโปรแกรมภาษา Java 71
รปท 3.19 แสดง Method ตางๆ ทใชในการอานและเขยนคาตวแปรของคลาส MyDate
เนองจากคลาส MyDate ไมม Constructor ดงนนเมอมการสรางวตถขนจากคลาสน ตวแปรของคลาสทงหมดทเปนชนด Primitive จะมคาเรมตนเปน 0 และคา false ส าหรบตวแปรชนด Boolean เพอใหผเขยนโปรแกรมสามารถตงคาเรมตนใหกบตวแปรของคลาส จงจ าเปนตองสราง Constructor ขนดงในภาพท 3.20
ภาพท 3.20 แสดง Constructors ของคลาส MyDate
+setDay(in d : int)
+setMonth(in m : int)
+setYear(in y : int)
+getDay() : int
+getMonth() : int
+getYear() : int
-day : int
-month : int
-year : int
MyDate
+main()
TestMyDate
public class TestMyDate{
public static void main(String[] args) {
MyDate myDate = new MyDate();
myDate.setDay(1); myDate.setMonth(6);
myDate.setYear(2004);
System.out.println("Today is " + myDate.getDay() + "/" + myDate.getMonth() + "/" + myDate.getYear() );
}
}
public class MyDate{
private int day;
private int month;
private int year;
public void setDay(int d) {
day = d;
}
public void setMonth(int m) {
month = m;
}
public void setYear(int y) {
year = y;
}
public int getDay() {
return day;
}
public int getMonth() {
return month;
}
public int getYear() {
return year;
}
}
+MyDate()
+MyDate(in d : int, in m : int)
+MyDate(in d : int, in m : int, in y : int)
+setDay(in d : int)
+setMonth(in m : int)
+setYear(in y : int)
+getDay() : int
+getMonth() : int
+getYear() : int
72 การเขยนโปรแกรมภาษา Java
public class MyDate{
private int day;
private int month;
private int year;
// ผเรยกใชงานวตถ MyDate ไมมการระบคาเรมตนให ดงนนจงก าหนดใหคาเรมตนเปน 1/1/2000 public MyDate() {
day = 1; month = 1; year = 2000;
}
// ผเรยกใชงานวตถ MyDate มการระบเพยงคาวนและเดอน ดงนนจงก าหนดใหคาเรมตนเปน d/m/2000 public MyDate(int d, int m) {
day = d; month = m; year = 2000;
}
// ผเรยกใชงานวตถ MyDate และก าหนดใหคาเรมตนเปน d/m/y public MyDate(int d, int m, int y) {
day = d; month = m; year = y;
}
public void setDay(int d) {
day = d;
}
public void setMonth(int m) {
month = m;
}
public void setYear(int y) {
year = y;
}
public int getDay() {
return day;
}
public int getMonth() {
return month;
}
public int getYear() {
return year;
}
}
โปรแกรมดานบนแสดง Constructor ของคลาส MyDate ซงม Constructors มากวาหนง เพราะในภาษา
Java อนญาตใหตงซอ Constructor ซ ากนได (Overloading) Class Diagram: Inheritance
ส าหรบ Class Diagram ทแทนการ Inherit ระหวางคลาสแมและคลาสลก ใชลกศรสามเหลยมจากคลาสลกไปคลาสแมดงภาพท 3.21 ซงแสดงภาพ Class Diagram ของคลาสแม Shape คลาสลก Circle และคลาสลก Square
การเขยนโปรแกรมภาษา Java 73
รปท 3.21 แสดงภาพการ Inherit ในสวนตอไปแสดงโปรแกรม Shape.java, Cicle.java และ Square.java ทตรงกบ Class Diagram ในภาพ 3.21 // Shape.java public class Shape{
protected int x;
protected int y;
public Shape() {
x =0; y=0;
}
public void move(int toX, int toY) {
x = toX;
y = toY;
}
public void printXY() {
System.out.println("X is " + x + “ Y is " + y);
}
}
คลาส Shape เปนคลาสแมซงม Properties อยสองตวแปรคอ protected int x และ protected int y ซงคลาสลกจะสามารถอางการใชงานแบบ protected จากคลาส Shape ไดโดยตรงซงแตกตางตวแปรทเปนแบบ private ซงคลาสลกไมสามารถเรยกใชงานได
+Shape()
+move(in toX : int, in toY : int)
+printXY()
#x : int
#y : int
Shape
+Circle()
+Circle(in rIn : double)
+area() : double
-r : double
Circle
+Square()
+Square(in sideIn : double)
+area() : double
-side : double
Square
Circle extends Shape
74 การเขยนโปรแกรมภาษา Java
// Circle.java public class Circle extends Shape{
private double r;
public Circle() {
r =0;
}
public Circle(double rIn) {
r = rIn;
}
public double area() {
return (22.0/7.0 * r *r);
}
}
คลาส Circle เปนคลาสลกของคลาส Shape ซงจะไดรบการถายทอดตวแปรและ Method ของคลาส Shape มาทงหมดมาดวย // Square.java public class Square extends Shape{
private double side;
public Square() {
side = 0;
}
public Square(double sideIn) {
side = sideIn;
}
public double area() {
return (side * side);
}
}
ความสมพนธระหวางการ Inherit และ Constructor คลาสทเปนคลาสลกจะมการสบทอด Attribute และ Method ชนด public และ protected จากคลาสแมทงหมด แตจะไมสบทอด Attribute และ Method ทเปนชนด private จากคลาสแม
คลาสลกสามารถเรยกใช Method ทเปน public และ protected ของคลาสแมทก Method ยกเวน Constructor Method ของคลาสแมซงจะไมมการสบทอดมาสคลาสลก ในกรณทมการสรางวตถจากคลาสลก จะมการเรยกใช Constructor ของคลาสลกเทานน โดยไมมการเรยก Constructor ของคลาสแม ดงนนผเขยนโปรแกรมภาษา Java จ าเปนตองมการใสค าสงเรยกใช Constructor ของคลาสแมในสวนทเปน Constructor Method ของคลาสลกเอง
การเขยนโปรแกรมภาษา Java 75
+name : String
Table
โปรแกรมตอไปแสดงการสรางวตถของคลาส Table ซงในคลาสนไมม Constructor ใดเลย และมเพยงตวแปรชอ public String name เทานนดงภาพท 3.22 class Table {
public String name;
}
public class TestConstructor {
public static void main(String[] args) {
Table t = new Table();
}
}
ภาพท 3.22 แสดง Class Diagram ของ Table จากโปรแกรม TestConstructor.java เมอ main() มการสรางวตถจากคลาส Table โดยเรยก Default Constructor (คอ Constructor ทไมรบ Parameter ใดๆ เลย) ซงในคลาส Table ไมม Default Constructor นอย เมอน าโปรแกรมผานตวแปรภาษา ตวแปรภาษาจะเพม Default Constructor ใหโดยอตโนมต สงผลใหโปรแกรมนไมมความผดพลาด ดงตวอยาง class Table {
public String name;
public Table() {} // ตวแปรภาษาจะเพม Default Constructor ใหอตโนมต
} แตถาผเขยนโปรแกรมมการสราง Constructor อนในคลาส Table ตวแปรภาษา Java จะไมมการเพม Default Constructor ใหอก ดงนนถามการสรางวตถโดยใช Default Constructor จะท าใหโปรแกรมผดพลาด เมอผานตวแปรภาษา Java ดงตวอยางโปรแกรม TestConstructor1.java class Table {
public String name; public Table(String name) { this.name = name; }
}
Default Constructor
76 การเขยนโปรแกรมภาษา Java
public class TestConstructor1 { public static void main(String[] args) {
/* เกดความผดพลาดเมอน าโปรแกรมผานตวแปรภาษา Java เนองจากคลาส Table ไมม Default Constructor อย */
Table t = new Table();
} }
ดงนนถาตองการใหโปรแกรมท างานได ผเขยนโปรแกรมจ าเปนตองทราบวาในคลาส Table ม Constructor ใดอยส าหรบการเรยกใชงาน ดงตวอยางตอไป TestConstructor2.java class Table{
public String name; public Table(String name) { this.name = name; } } public class TestConstructor2 { public static void main(String[]args) { Table t = new Table(“Glass Table”); } }
ถาผเขยนโปรแกรมตองการเรยกใชงาน Default Constructor ในคลาส Table ผเขยนโปรแกรมจ าเปนตองเขยน Default Constructor เพมขนเอง เนองจากตวแปรภาษาจะไมสราง Default Constructor ให ดงทกลาวไปแลว ดงตวอยางโปรแกรม TestConstructor3.java class Table {
public String name;
// เพม Default Constructor ในกรณทม Constructor อนอยแลว public Table(){ name = “none”; } public Table(String name){ this.name = name; } } public class TestConstructor3 { public static void main(String[]args) { Table t = new Table(“Glass Table”);
Table t1 = new Table(); } }
การเขยนโปรแกรมภาษา Java 77
+Person(in nameIn)
+getName() : String
-name : String
Person
+Student(in idIn : String, in name : String)
-id : String
Student
ส าหรบตวอยางตอไปแสดงความสมพนธระหวางการ Inherit และ Constructor ของคลาส Person และ Student โดยทการสรางวตถจากคลาส Student ผเขยนโปรแกรมมการเรยกใช Constructor ของคลาส Student แตไมไดเรยกใช Constructor ของคลาส Person ซงเปนคลาสแม ดงภาพท 3.23
ภาพท 3.23 แสดง Class Diagram ของ Person และ Student
ตวแปร name ของคลาส Person ในภาพท 3.23 จะไมถกตงคา เนองจากไมไดมการเรยก Constructor ของ Person เมอมการสรางวตถ Student และเนองจาก name เปนตวแปรชนด private ท าใหคลาส Student ไมสามารถเขาถงตวแปร name ของคลาส Person ได ดงนนเพอใหคลาส Student สามารถตงคาตวแปรของคลาส Person ได Java จงมค าสง super() ซงใชส าหรบคลาสลกทตองการเรยกใช Constructor ของคลาสแม ดงโปรแกรมตอไปซงแสดงค าสง super() ในคลาส Student public class Person{
private String name;
public Person(String nameIn) {
name = nameIn;
}
}
public class Student extends Person{
private String id;
public Student(String idIn, String name) {
super(name);
id = idIn;
}
}
การใชค าสง super() ของคลาสลก มขอแมวาตองเขยนเปนค าสงแรกกอนค าสงอน ตวอยางตอไปแสดงการเขยนโปรแกรมทผด เนองจากค าสง super() ไมอยบรรทดแรกของ Constructor
Student s = new Student(“1”, “Somchai”);
เรยกใช Constructor ของ Student
Call Person(name)
78 การเขยนโปรแกรมภาษา Java
// โปรแกรมนไมถกตอง public class Student extends Person{
private String id;
public Student(String idIn, String name) {
id = idIn;
/* ถา super() ไมอยเปนบรรทดแรก
จะเกดความผดพลาดเมอน าโปรแกรมผานตวแปรภาษา */ super(name); }
}
ถาคลาสแมม Constructor หลายแบบ คลาสลกสามารถเรยกใชงาน Constructor ของคลาสแมได ผานทางค าสง super() โดยใชการระบ Parameter ทแตกตางกนของ Constructor ในคลาสแม (จะกลาวถงค าสง super() อกครงในบทท 8)
การเขยนโปรแกรมภาษา Java 79
สรป สวนประกอบของ OOP ม 4 ขอคอ
1. Abstraction ในการสรางวตถจะการพจารณาถงคณสมบตทเกยวของเทานน ท าใหการออกแบบวตถตรงกบวตถประสงคทตงไว
2. Encapsulation การน าเอา Method รวมไวเปนสวนหนงของวตถ เพอซอนรายละเอยดของวตถไว ลดความซบซอนในการใชงานของวตถลง
3. Inheritance การถายทอดคณสมบตจากคลาสแมไปสคลาสลก และคลาส Object เปนคลาสแรกทวตถทกชนดในภาษา Java จะมการสบทอดคณสมบตมา
4. Polymorphism แบงเปน Overloading และ Overriding เพอชวยใหผเขยนโปรแกรมสามารถตงชอ Method ซ ากนได ท าใหสะดวกในการใชงาน โดยทหนง Method สามารถใชงานไดกบขอมลทกชนด ดงเชนค าสง println()
Class Diagram ใน UML คอการแทนคลาสในเชงรปภาพ เพอใชเปนชองทางส าหรบสอสารระหวางผพฒนาโปรแกรมรวมกนอยางมประสทธภาพ
80 การเขยนโปรแกรมภาษา Java
แบบฝกหดทายบทท 3
1. อธบายถงองคประกอบทง 4 สวนของ OOP 2. อธบายความแตกตางระหวางคลาสและวตถ 3. ค าสง new ในภาษา Java ท าหนาทอะไร 4. อธบายขอแตกตางระหวาง Overriding และ Overloading 5. Constructor ของคลาสท าหนาทอะไร 6. อธบายขอดของการเขยนโปรแกรมแบบ OOP เมอเปรยบเทยบกบการเขยนโปรแกรมแบบกระบวนค าสง 7. จงเขยนนยามของคลาสโดยใช UML: Class Diagram
1.1. Car 1.2. Radio Player 1.3. Human 1.4. Book 1.5. Telephone 1.6. Clock 1.7. Computer 1.8. Desk 1.9. Pen 1.10. Student 1.11. Video Member 1.12. House
Programming Problems 1. จงปรบปรงคลาส MyDate.java จากภาพท 3.18 โดยใหสามารถตรวจสอบวา ผใชงานคลาสนตงคาวนเดอนป
ถกตองหรอไม ถาไมถกตองใหแสดงขอความวาเตอนทางจอภาพ ตวอยางวนทไมถกตองคอ 32/5/2004 -1/1/2004 30/2/2004 29/2/2003 20/15/2004
การเขยนโปรแกรมภาษา Java 81
2. จงสรางคลาส Book โดยใชภาพ Class Diagram ตอไปน และใชโปรแกรม TestBook.java ในการทดสอบ 3. จงใช Class Diagram และ TestStudent.java ทใหมา เขยนคลาส Register, Student และ Course ใหสมบรณ
+Book()
+Book(in titleIn : String, in typeIn : String)
+setTitle(in titleIn : String)
+setType(in typeIn : String)
+getTitle() : String
+getType() : String
-title : String = "No name"
-type : String = "No type"
Book
public class TestBook
{
public static void main(String[] args) {
Book b1 = new Book(“Superman”, “Cartoon”);
Book b2 = new Book();
b2.setTitle(“Spider Man”);
System.out.println(b1.getTitle() + “ is ” + b1.getType() );
System.out.println(b2.getTitle() + “ is ” + b2.getType() );
}
}
+Student()
+Student(in id : String, in name : String)
+setId(in id : String)
+setName(in name : String)
+getId() : String
+getName() : String
-id : String
-name : String
Student
+Course()
+Course(in id : String, in name : String)
+setId(in id : String)
+setName(in name : String)
+getId() : String
+getName() : String
-id : String
-name : String
Course
+Register(in student : Student, in course : Course)
+setGrade(in grade : String)
+setGrade(in score : int)
+getGrade() : String
-grade : String = "None"
+fromStudent : Student
+toCourse : Course
Register
1
* *
1
82 การเขยนโปรแกรมภาษา Java
public class TestStudent{
public static void main(String[] args) {
Student s1 = new Student("1440712345", "Piwat");
Student s2 = new Student("1440767890", "Dara");
Course c1 = new Course("CS455", "Computer Network");
Course c2 = new Course("CS311", "Computer Programming II");
Register r1 = new Register(s1, c1);
Register r2 = new Register(s1, c2);
Register r3 = new Register(s2, c1);
r1.setGrade("A");
r2.setGrade("B");
r3.setGrade(85);
System.out.println(r1.fromStudent.getName() + " has " + r1.getGrade() +
" in " + r1.toCourse.getId() + " " + r1.toCourse.getName() );
System.out.println(r2.fromStudent.getName() + " has " + r2.getGrade() +
" in " + r2.toCourse.getId() + " " + r2.toCourse.getName() );
System.out.println(r3.fromStudent.getName() + " has " + r3.getGrade() +
" in " + r3.toCourse.getId() + " " + r3.toCourse.getName() );
}
}
การเขยนโปรแกรมภาษา Java 83
+Video(in code : String, in name : String)
+setCode(in code : String)
+setName(in name : String)
+getCode() : String
+setName() : String
+checkOut() : bool
+checkIn()
+isRent() : bool
+toString() : String
-code : String
-name : String
-rent : bool = false
Video
+Person(in id : String, in name : String, in address : String)
+setName(in name : String)
+setId(in id : String)
+setAddress(in address : String)
+setSex(in sex : String)
+getName() : String
+getId() : String
+getAddress() : String
+getSex() : String
-name : String
-id : String
-address : String
-sex : String
Person
+working()
+Employee(in employeeId : String, in salary : int)
-employeeId : String
-salary : int
Employee
+VideoMember(in memberId : String, in name : String)
+checkOutVideo(in video : Video) : bool
+returnVideo(in index : int)
-memberId : String
-videoRent[0..2]
-numberOfRentedVideo : int = 0
VideoMember
4. จากรปแสดง Class Diagram ของระบบเชาวดโอของรานแหงหนง จงเขยนโปรแกรมของทกคลาสใหสมบรณ รวมทงโปรแกรมหลก TestRentedVideo.java ทม Method main() ใชในการจ าลองการยมคนวดโอดวย
คลาส Video o ประกอบดวย 3 Attributes: code, name และ rent o ม Methods ทใชในการตงคา code และ name o ม Methods ทใชในการอานคา code และ name o Method checkOut () ใชในการยมวดโอ ถากรณทวดโอนถกยมไปแลวใหสงคากลบเปน false
พรอมทงตงคา rent เปน ture ในกรณทวดโอยงไมถกยม ใหสงคากลบเปน true และตงคา rent เปน false
o Method checkIn() ใชในการคนวดโอ โดยใหตงคา rent ใหเปน false ทกกรณ เมอมการเรยกใช Method น
o Method isRent() ใชในการตรวจสอบวาวดโอนถกยมไปหรอไม o Method toString() ใหสงคากลบวา วดโอนชออะไร และถกยมไปหรอไม
คลาส Person o ประกอบดวย 4 Attributes: name, id, address และ sex o ม Method ทใชในการตงคา และอานคา Attribute ตางๆ o มคลาสลกคอ VideoMember และ Employee
84 การเขยนโปรแกรมภาษา Java
คลาส VideoMember o มการ Inherit จากคลาส Person o Method checkOutVideo (Video video) ใชในการยมวดโอของลกคา โดยระบวตถวดโอท
ตองการยม Method นจะสงคากลบเปน true เมอวดโอทยมนไมมลกคาคนอนยม และสงคา false ในกรณทมลกคาอนยมวดโอนแลว พรอมทงน าวตถวดโอนไปเกบไวใน Array ชองทวางอย โดยมขอแมวาลกคา 1 คนสามารถมวดโอไดไมเกน 3 มวน ถาลกยมเกน 3 มวนแลว Method นจะสงคา false กลบ
o เพมคา numberOfRentedVideo ทกครงเมอมการยม และลบ 1 เมอมการคน โดยคาสงสดเปน 3 และต าสดเปน 0 เทานน
o Method returnVideo(int index) เมอลกคาคนวดโอสามารถระบไดวาตองการคนวดโอในต าแหนงใดของ Array โดยทตองมการตรวจสอบดวยวามวดโอในต าแหนงนนจรง (ใช instanceof ในการทดสอบ) และตงคา video[index] = null ดวย
คลาส Employee o มการ Inherit จากคลาส Person o ม Attribute 2 คาคอ employeeId และ salary o เมอมการเรยกใช Method working () ใหพมพขอความวา “I am working” เทานน