42
บทที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 เป็นต้น และนาอุปกรณ์ต่างๆ

บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

บทท 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 เปนตน และน าอปกรณตางๆ

Page 2: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

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 ขอทกลาวในเบองตน

Page 3: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

การเขยนโปรแกรมภาษา Java 45

ภาพท 3.1 ผลไม

ในภาพท 3.1 การออกแบบผลไมโดยค านงถงพลงงานทมในผลไมเทานน ใชหลกการของ Abstraction การก าจดขอมลทไมเกยวของทงไปใหเหลอขอมลทตองการ ดงนนผลไมมคณสมบตคอ น าหนก และ พลงงานตอ 1 กรม สวนการท างานของผลไมคอ การค านวณหาพลงงานทงหมด คณสมบตอนๆ ทไมเกยวของเชน ส รสชาต กลน และ รปราง จะไมน ามาพจารณา ถาน าคณสมบตทไมเกยวของมาพจารณาอาจท าใหการออกแบบวตถผดพลาดจากวตถประสงคทตงไว

คลาส (Class) และวตถ (Object)

กอนการสรางวตถ จ าเปนตองมการออกแบบวตถกอน เชนการสรางบาน สถาปนกตองออกแบบโครงสรางของบานลงบนกระดาษพมพเขยว จากนนวศวกรจงน ากระดาษพมพเขยวไปสรางเปนบาน กระดาษพมพเขยวมเพยงแผนเดยว แตสามารถน าไปสรางบานไดหลายสบหลง ในมมมองของ OOP กระดาษพมพเขยวเปรยบเหมอนคลาส และบานทถกสรางขนเปรยบเหมอนวตถ ดงนนกอนทจะสรางวตถตองมการออกแบบคลาสของวตถนนขนมากอน

จากภาพท 3.2 ตรายาเปรยบไดเปนคลาส และเมอน าตรายางไปกดลงบนกระดาษ รอยพมพทอยบนกระดาษคอวตถ ตรายางนนไมสามารถน าไปใชไดโดยตรง แตรอยพมพสามารถน าไปใชได และตรายางสามารถสรางรอยพมพไดหลายรป หลายส ดงนนตรายางกคอตวอยางทดอนหนงทแสดงใหเหนถงขอแตกตาง ระหวาง คลาส และวตถ

รปท 3.2 ตรายางรปหวใจเปรยบเสมอนคลาส รอยพมพทเกดจากตรายางคอวตถ

ตรายาง

คณสมบต (Attributes) น าหนก (กรม) พลงงานตอ 1 กรม

การท างานของวตถ (Methods) การค านวณจ านวนพลงงานทงหมด

Page 4: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

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

Page 5: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

การเขยนโปรแกรมภาษา 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

Page 6: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

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

Page 7: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

การเขยนโปรแกรมภาษา 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) ถกเรยกใชงาน

Page 8: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

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

Page 9: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

การเขยนโปรแกรมภาษา 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() ในแตละคลาสจะแตกตางกน

Page 10: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

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

Page 11: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

การเขยนโปรแกรมภาษา 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;

}

}

Page 12: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

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);

Page 13: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

การเขยนโปรแกรมภาษา 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()

Page 14: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

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";

}

Page 15: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

การเขยนโปรแกรมภาษา 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() );

Page 16: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

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 ประกอบ

Page 17: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

การเขยนโปรแกรมภาษา 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

Page 18: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

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

Page 19: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

การเขยนโปรแกรมภาษา 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 ใน

Page 20: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

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);

Page 21: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

การเขยนโปรแกรมภาษา 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

Page 22: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

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

Page 23: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

การเขยนโปรแกรมภาษา 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 เมอกลาวถงค าวาโมเดล ผอานอาจนกถงรปแบบจ าลองตางๆ เชน รปแบบจ าลองรถยนต เครองบน หรอหนยนต ทเคยเลนตอนเปนเดก อนทจรงแลววตถประสงคหลกของการสรางโมเดลนนคอ การทดสอบวาสงทออกแบบมาบนกระดาษจะสามารถน ามาสราง

Page 24: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

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

Page 25: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

การเขยนโปรแกรมภาษา 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

Page 26: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

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

Page 27: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

การเขยนโปรแกรมภาษา 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 ได

Page 28: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

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);

}

}

Page 29: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

การเขยนโปรแกรมภาษา 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

Page 30: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

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

Page 31: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

การเขยนโปรแกรมภาษา 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

Page 32: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

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 ของคลาสลกเอง

Page 33: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

การเขยนโปรแกรมภาษา 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

Page 34: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

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(); } }

Page 35: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

การเขยนโปรแกรมภาษา 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)

Page 36: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

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)

Page 37: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

การเขยนโปรแกรมภาษา Java 79

สรป สวนประกอบของ OOP ม 4 ขอคอ

1. Abstraction ในการสรางวตถจะการพจารณาถงคณสมบตทเกยวของเทานน ท าใหการออกแบบวตถตรงกบวตถประสงคทตงไว

2. Encapsulation การน าเอา Method รวมไวเปนสวนหนงของวตถ เพอซอนรายละเอยดของวตถไว ลดความซบซอนในการใชงานของวตถลง

3. Inheritance การถายทอดคณสมบตจากคลาสแมไปสคลาสลก และคลาส Object เปนคลาสแรกทวตถทกชนดในภาษา Java จะมการสบทอดคณสมบตมา

4. Polymorphism แบงเปน Overloading และ Overriding เพอชวยใหผเขยนโปรแกรมสามารถตงชอ Method ซ ากนได ท าใหสะดวกในการใชงาน โดยทหนง Method สามารถใชงานไดกบขอมลทกชนด ดงเชนค าสง println()

Class Diagram ใน UML คอการแทนคลาสในเชงรปภาพ เพอใชเปนชองทางส าหรบสอสารระหวางผพฒนาโปรแกรมรวมกนอยางมประสทธภาพ

Page 38: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

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

Page 39: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

การเขยนโปรแกรมภาษา 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

Page 40: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

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() );

}

}

Page 41: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

การเขยนโปรแกรมภาษา 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

Page 42: บทที่ 3 การเขียนโปรแกรมเชิง ...lily.bu.ac.th/~thirapon.w/gim/OOP_files/Chapter3.pdf · 2012-11-09 · การเขียนโปรแกรมภาษา

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” เทานน