คลาส เมท็อด และ อ็อบเจกต์ · คลาส...

43
IS512 Introduction to Objected-Oriented Programming วันชัย ขันตี ภาควิชาระบบสารสนเทศเพื่อการจัดการ คณะพาณิชยศาสตร์และการบัญชี มหาวิทยาลัยธรรมศาสตร์ บทที่ ๔ คลาส เมท็อด และ อ็อบเจกต์ ในบทนี้จะกล่าวถึงวิธีสร้างอ็อบเจกต์ โดยตอนแรกจะกล่าวถึงการสร้างอ็อบเจกต์จากคลาสที่มีให้ใช้อยูแล้วเพื่อเรียนรู้วิธีการสร้างอ็อบเจกต์อย่างรวดเร็ว ต่อจากนั้นจึงจะกล่าวถึงวิธีเขียนคลาสใหม่ขึ้นใช้เอง ซึ่งคลาส ใหม่ที่เราเขียนขึ้นนีจะใช้เป็นแม่แบบในการสร้างอ็อบเจกต์ให้มีสมบัติและพฤติกรรมตามที่เราต้องการ ส่วน การที่อ็อบเจกต์จะมีพฤติกรรมใดนั้น ขึ้นอยู่กับเมท็อด(method)ต่าง ๆ ของคลาส หรือกล่าวอีกนัยหนึ่งก็คือ ขึ้นอยู่กับข้อความสั่งต่าง ๆ ที่เราเขียนขึ้นมาและบรรจุไว้ในคลาสเมท็อดนั่นเอง ในบทนี้จะกล่าวถึงการเขียน คลาสขั้นพื้นฐานเพื่อให้ผู้เรียนสามารถนาคลาสที่เขียนขึ้นไปสร้างอ็อบเจกต์ให้ทางานอย่างง่าย อันเป็นพื้นฐาน ในการเรียนบทต่อ ๆ ไป ส่วนรายละเอียดที่มากขึ้นและความรู้ขั้นสูงเกี่ยวกับคลาสและอ็อบเจกต์จะกล่าว เพิ่มเติมในบททีและ โครงสร้างของคลาส คลาสถือว่าเป็นแม่แบบที่ใช้ในการสร้างอ็อบเจกต์ คลาสหนึ่ง ๆ สามารถนาไปใช้สร้างอ็อบเจกต์ได้หลาย ตัว อ็อบเจกต์แต่ละตัวที่สร้างมาจากคลาสเดียวกันจะมีพฤติกรรมตามแม่แบบคือคลาสของมัน อ็อบเจกต์ที่สร้าง มาจากคลาสเดียวกันอาจมีสมบัติบางอย่างที่แตกต่างกันไปได้บ้าง บางอ็อบเจกต์อาจมีลักษณะเฉพาะบางอย่าง เป็นของตนเอง แต่สมบัติโดยรวมของอ็อบเจกต์ส่วนใหญ่แล้วใกล้เคียงกัน ในการเขียนโปรแกรมจาวานั้น เราจะเขียนคลาสขึ้นมาเพื่ออธิบายอ็อบเจกต์ที่มีลักษณะและพฤติกรรม แบบเดียวกัน ถ้าอ็อบเจกต์ที่ต้องการมีสมบัติและพฤติกรรมที่แตกต่างกันกันออกไปค่อนข้างมาก เรานิยมเขียน แยกไว้เป็นคลาสอื่น คนละคลาสกัน โปรแกรมต้นฉบับภาษาจาวาประกอบด้วยคลาสจานวนหนึ่งเขียนรวมกันไว้ในแฟ้มโปรแกรมต้นฉบับ เดียวกัน ในแฟ้มโปรแกรมต้นฉบับหนึ่ง ๆ อาจบรรจุคลาสเพียงคลาสเดียวหรือหลายคลาสก็ได้ ในแต่ละคลาส ตัวแปรสมาชิก เมธอดสมาชิกสมาชิก คลาส 1 คลาส 2 คลาส n ... คลาสสมาชิก โปรแกรมจาวา คลาส รูปที-แสดงโครงสร้างของโปรแกรมจาวา และคลาส

Transcript of คลาส เมท็อด และ อ็อบเจกต์ · คลาส...

Page 1: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

IS512 Introduction to Objected-Oriented Programming

วนชย ขนต ภาควชาระบบสารสนเทศเพอการจดการ คณะพาณชยศาสตรและการบญช มหาวทยาลยธรรมศาสตร

บทท ๔ คลาส เมทอด และ ออบเจกต

ในบทนจะกลาวถงวธสรางออบเจกต โดยตอนแรกจะกลาวถงการสรางออบเจกตจากคลาสทมใหใชอยแลวเพอเรยนรวธการสรางออบเจกตอยางรวดเรว ตอจากนนจงจะกลาวถงวธเขยนคลาสใหมขนใชเอง ซงคลาสใหมทเราเขยนขนน จะใชเปนแมแบบในการสรางออบเจกตใหมสมบตและพฤตกรรมตามทเราตองการ สวนการทออบเจกตจะมพฤตกรรมใดนน ขนอยกบเมทอด(method)ตาง ๆ ของคลาส หรอกลาวอกนยหนงกคอ ขนอยกบขอความสงตาง ๆ ทเราเขยนขนมาและบรรจไวในคลาสเมทอดนนเอง ในบทนจะกลาวถงการเขยนคลาสขนพนฐานเพอใหผเรยนสามารถน าคลาสทเขยนขนไปสรางออบเจกตใหท างานอยางงาย อนเปนพนฐานในการเรยนบทตอ ๆ ไป สวนรายละเอยดทมากขนและความรขนสงเกยวกบคลาสและออบเจกตจะกลาวเพมเตมในบทท ๕ และ ๘

โครงสรางของคลาส

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

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

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

ตวแปรสมาชก

เมธอดสมาชกสมาชก

คลาส 1

คลาส 2

คลาส n

... คลาสสมาชก

โปรแกรมจาวา คลาส

รปท ๔-๑ แสดงโครงสรางของโปรแกรมจาวา และคลาส

Page 2: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

การสรางโปรแกรมเชงวตถดวยภาษาจาวา

วนชย ขนต ภาควชาระบบสารสนเทศเพอการจดการ คณะพาณชยศาสตรและการบญช มหาวทยาลยธรรมศาสตร 2

อาจประกอบดวยสมาชกเพยงประเภทใดประเภทหนงหรอหลายประเภทจากสมาชกประเภทตาง ๆ ๓ ประเภทตอไปนคอตวแปรสมาชก(member variable) เมทอดสมาชก(member method) และ คลาสสมาชก(member class) โดยทสมาชกแตละประเภทสามารถมอยในคลาสไดเพยงหนงเดยวหรอมากกวาหนง หรออาจไมมเลยกได โครงสรางของโปรแกรมและคลาสแสดงไดดงรปท ๔-๑

ตวแปรสมาชก เปนตวแปรทก าหนดไวในคลาสส าหรบเกบสมบต (property) ของออบเจกต ตวแปรสมาชกยงแบงออกเปน ๒ ชนดคอ ตวแปรอนสแทนซ (instance variable) และตวแปรคลาส (class variable) ตวแปรอนสแทนซถอวาเปนตวแปรของแตละออบเจกตจะเกดขนพรอมกบการสรางออบเจกตใหม จะมอยในทกออบเจกตทสรางขนมาและอยไปตลอดจนกวาออบเจกตนนจะไมใชงานและถกท าลายไป ดงนนถาสรางออบเจกตหลายตวขนมาจากคลาสเดยวกน จะมตวแปรอนสแทนซอยในทกออบเจกตโดยทตวแปรในออบเจกตเหลานจะเปนอสระตอกน ออบเจกตใครออบเจกตมน สวนตวแปรคลาสไมไดเกบไวในออบเจกตแตจะเกบอยในคลาส ตวแปรคลาสนจะมตวตนเกดขนพรอมกบการโหลดคลาสเขาสหนวยความจ า ตวแปรชนดนแตละชอทประกาศไวจะมเพยงตวเดยวอยในพนทหนวยความจ าของคลาสเทานน ตางจากตวแปรอนสแทนซทเกดขนหลายชดตามจ านวนออบเจกตทสรางขน ตวแปรคลาสจะอยไปตลอดตราบใดทคลาสของมนยงท างานอยในหนวยความจ า ตวแปรคลาสจะมเพยงชดเดยวอยคกบคลาส ออบเจกตตาง ๆ ของคลาสเดยวกนจะใชตวแปรคลาสทมอยเพยงทเดยวนรวมกน เนองจากวาตวแปรคลาสมตวตนเกดขนเมอมการน า (load) คลาสเขาสหนวยความจ า จงสามารถเขาถงตวแปรชนดนไดโดยทไมตองสรางออบเจกตขนมากได

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

เมทอดสมาชก เปนทรวมของชดค าสงทก าหนดไวในคลาสส าหรบแสดงพฤตกรรมหรอความสามารถบางอยาง เมทอดสมาชกแบงออกได ๒ ชนดท านองเดยวกบตวแปรสมาชกคอ อนสแทนซเมทอด(instance method) และคลาสเมทอด(class method) อนสแทนซเมทอดถอวาเกาะอยกบออบเจกต ตองสรางออบเจกตขนมากอนจงจะเรยกใชเมทอดชนดนได เวลาเรยกใชตองบอกดวยวาเรยกใชอนสแทนซเมทอดใด สวนคลาสเมทอดถอวาเกาะอยกบคลาสของมน สามารถเรยกใชไดโดยไมตองสรางออบเจกต

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

ในการสรางคลาสนน สามารถเขยนสมาชกทง ๓ ประเภทนอยางละกตวกได ประเภทใดมากอนหรอหลงกไดไมมกฎเกณฑแตอยางใด แตควรวางในต าแหนงทดเขาใจงาย สมาชกทง ๒ ประเภทแรกจะกลาวถงในบทน สวนคลาสสมาชกจะกลาวถงในบทอน

Page 3: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

คลาส เมธอดและออบเจกต

3

การสรางออบเจกต

ในการเขยนโปรแกรมจาวานนเรามกก าหนดชดของคลาสตาง ๆ ขนมา คลาสเหลานจะถกใชเปนแมแบบในการสรางออบเจกต ในการเขยนโปรแกรมจาวาเราใชคลาสทมการเขยนก าหนดเอาไวลวงหนาแลว ในตอนแรกของบทน เราจะเรยนรวธสรางออบเจกตใหม(instantiation)โดยใชคลาสจากคลงคลาส(class library) ทมใหใชอยแลวเปนแมแบบ ตอจากนนจงจะเรยนรวธสรางคลาสขนใชเอง

นพจนสรางออบเจกตใหม

ในโปรแกรมจาวานน ออบเจกตตาง ๆ ไมไดเกดขนเองโดยอตโนมต นกเขยนโปรแกรมเปนผสงวาจะสรางออบเจกตเมอใด ในการสรางออบเจกตใหมแตละครง เราใชนพจนซงประกอบดวยค าส าคญ new ควบคกบชอคลาสทเราตองการใหเปนแมแบบในการสรางออบเจกต ตามดวยวงเลบเปดและวงเลบปด ดงตวอยาง

new Random()

นพจนนแสดงการสรางออบเจกตของคลาส Random วงเลบทใสไวหลงชอคลาสมความส าคญเปนอยางยง ไมใสไมได ภายในวงเลบสามารถเวนวางไวได หรอบางครงภายในวงเลบอาจบรรจอารกวเมนต(argument)หรอพารามเตอร(parameter) ซงใชเปนคาเรมตนใหกบตวแปรหรอสมบตเรมตนของออบเจกตทเราตองการสราง อารกวเมนตเปนนพจน เมอหาคาผลลพธไดแลว คานนจะถกสงไปใชประกอบการสรางออบเจกต ตวอยางนไมมอารกวเมนตแตอยางใด

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

ตวอยางตอไปนเปนตวอยางการสรางออบเจกตใหม โดยทมการรบอารกวเมนตดวย new Random(123456);

new Point(0,0);

ตวอยางนแสดงการสรางออบเจกตของคลาส Random และ Point โดยใสอารกวเมนตไวในวงเลบดวย ตวอยางนเราใสอารกวเมนตใหคลาส Point ไวในวงเลบจ านวน ๒ ตว ถามอารกวเมนตมากกวา ๑ ตว จะตองคนอารกวเมนตแตละตวดวยจลภาค (,) จ านวนและชนด(type)ของอารกวเมนตทสามารถใสไวในวงเลบไดนนถกก าหนดโดยคลาสของมนโดยใชเมทอด(method)พเศษทเรยกวาตวสราง (constructor) ซงจะกลาวถงภายหลงในบทน ถาเราเขยนโปรแกรมสรางออบเจกตใหมของคลาสใดคลาสหนงดวยจ านวนและชนดของอารกวเมนตทตางไปจากทก าหนดไวในคลาสนน ๆ คอมไพเลอรจะไมยอมปลอยใหผาน มนจะแสดงขอความแจงถงขอผดพลาดทเกดขน

Page 4: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

การสรางโปรแกรมเชงวตถดวยภาษาจาวา

วนชย ขนต ภาควชาระบบสารสนเทศเพอการจดการ คณะพาณชยศาสตรและการบญช มหาวทยาลยธรรมศาสตร 4

การด าเนนงานของนพจนสรางออบเจกตใหม

เมอมการสรางออบเจกตใหมดวยนพจนส าหรบสรางออบเจกตนน จะมการด าเนนการหลายอยางเกดขน

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

ตวสราง (constructor) เปนเมทอดพเศษมชอเหมอนชอคลาสใชส าหรบสรางและก าหนดการเรมตนใหกบออบเจกตใหม ตวสรางจะก าหนดคาเรมตนใหตวแปรอนสแทนซใหมทสรางขนมา หรออาจสรางออบเจกตใหมอน ๆ ทออบเจกตนนตองการ และกระท าการอนใดทออบเจกตนนจ าเปนตองท าเพอเรมตนตวมนเอง

คลาสหนง ๆ อาจมตวสรางไดหลายตวแตตองมจ านวนและชนดของอารกวเมนตทแตกตางกน ในนพจนสรางออบเจกตใหมเราสามารถระบอารกวเมนตทแตกตางกนนในรายการอารกวเมนต ขอแตกตางของชนดหรอจ านวนอารกวเมนตนเองจะเปนตวก าหนดวาตวสรางตวใดทถกเรยกใหท างาน ตวอยางเชนคลาส Random ทกลาวถงมาแลวมตวสรางหลายตว ตวสรางตวหนงไมตองการอารกวเมนต แตตวสรางอกตวตองการอารกวเมนตจ านวน ๑ ตว ดงนน ในการสรางออบเจกตของคลาส Random ดวยนพจนขางตนจงใชไดทง ๒

กรณ ในกรณทเราสรางคลาสของเราขนใชเอง เราสามารถก าหนดใหมตวสรางกตวกไดเทาทจ าเปน

การอางองถงออบเจกต

ในการสรางออบเจกตใหมนน จะมการหาทวางในหนวยความจ าเพอใชเปนทอยของออบเจกตใหมทก าลงสรางขน ซงทอยของมนเราไมรลวงหนาวาจะไดทใด ในการใชโปรแกรมแตละครงไมจ าเปนวาออบเจกตทสรางขนจะไดอยต าแหนงเดมเสมอไป และอาจมการสรางออบเจกตของคลาสเดยวกนหลายตวกได ดงนน ในการสงสาร(message)หรอตดตอกบออบเจกต เราจ าเนตองรวาเราจะสงสารใหออบเจกตตวใด ซงเราจ าเปนตองรทอยของออบเจกตนน เพอทจะไดตดตอไดถกตว ในทางปฏบตเราไมจ าเปนตองรทอยของออบเจกตโดยตรง จาวามวธอ านวยความสะดวกในเรองน เพอความสะดวกในการตดตอกบออบเจกตเราควรสรางตวแปรขนมาเพอเกบทอยของออบเจกตทเราตองการตดตอดวย ตวแปรซงเกบขอมลเปนทอยของขอมลหรอออบเจกตอนเรยกวาตวแปรอางอง (reference variable) ถาจะเรยกใหเจาะจงยงขน ตวแปรส าหรบเกบทอยหรอใชอางองถงออบเจกตเรยกวาตวแปรอนสแทนซ(object variable) ในการอางถงออบเจกตเราจะใชตวแปรอางองหรอนพจนทใหผลลพธของคาขอมลเปนชนดอางองในการอางถงออบเจกตทเราตองการตดตอดวย

ตวอยางตอไปนแสดงการประกาศตวแปรอางอง

Page 5: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

คลาส เมธอดและออบเจกต

5

Random randNum;

การประกาศตวแปรอางองมรปแบบท านองเดยวกบการประกาศตวแปรพนฐานทวไป ตางกนแตเพยงชนดของขอมลเทานน แทนทจะเปนชนดขอมลพนฐาน ชนดของขอมลจะเปนคลาส คลาสจดวาเปนชนดประเภทหนงทมความซบซอนมากวาชนดพนฐานทวไป ตวอยางน Random เปนชอคลาสซงถอวาเปนชนด สวน randNum เปนตวแปร ใชชอตามกฏการตงชอตวระบเชนเดยวกบตวแปรทวไป ตวแปร randNum ถอวาเปนตวแปรอางองเพราะวามนไมไดเกบออบเจกตไวในตวของมน แตเกบทอยของออบเจกตทมชนดเปนคลาส Random เพอใชในการเขาถงออบเจกตโดยออม ตวแปร randNum เปนตวแปรทใชในการอางถงออบเจกตของคลาส Random ในบางครง เพอความสะดวกและกระชบ เราจะเรยกชอตวแปรอางองเสมอนวาเปนชอออบเจกต

เราไมอาจก าหนดคาอนใดใหกบตวแปร(อางอง)ออบเจกตนอกจากทอยของออบเจกตทสรางมาจากคลาสทตวแปรอนสแทนซอางถง เราอาจสรางตวแปรอนสแทนซขนมากอนทจะสรางออบเจกตกได ในกรณเชนนตวแปรอนสแทนซจะยงไมเกบทอยของออบเจกตใดจนกวาเราจะน าคาทอยไปก าหนดใหมน ในกรณทเราตองการใหตวแปรอนสแทนซไมอางองไปทออบเจกตใดเลย เราอาจก าหนดคาของตวแปรอางองใหเปน null ซงเปนคาคงททใชแทนความหมายวาไมไดอางองไปยงออบเจกตใด เชน

randNum = null;

หลงจากท าขอความสงนแลวตวแปรอนสแทนซ randNum จะมคาเปน null ซงหมายความวาไมไดอางองไปทใด หากกอนหนาน randNum เกบคาทอยของออบเจกตใดอย randNum จะไมอางถงออบเจกตนนอกตอไป

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

randNum = new Random();

ตวอยางนหมายความวา เมอสรางออบเจกตของคลาส Random เสรจเรยบรอยแลวใหเอาทอยของออบเจกตนนมาใสไวในตวแปรอางอง randNum

เพอความกระชบของโปรแกรมเรามกประกาศตวแปรอางองพรอม ๆ ไปกบการสรางออบเจกต ดงตวอยาง

Random randNum = new Random();

ตวอยางนมการประกาศตวแปรอางองชอวา randNum มชนดเปนคลาส Random พรอมทงก าหนดคาเรมตนใหมคาเปนทอยของออบเจกตของคลาส Random ทสรางขนใหมรปท ๔-๑ แสดงความสมพนธระหวางตวแปรอางองกบออบเจกต สมมตวาออบเจกต a เปนออบเจกตทสรางมาจากคลาส Random ตงอยในหนวยความจ าทต าแหนง 100 ตวแปรอางอง randNum จะเกบคาเลขทอย (address) ของออบเจกต a ดงนนตวแปร randNum จะมคาเปน 100

Page 6: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

การสรางโปรแกรมเชงวตถดวยภาษาจาวา

วนชย ขนต ภาควชาระบบสารสนเทศเพอการจดการ คณะพาณชยศาสตรและการบญช มหาวทยาลยธรรมศาสตร 6

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

ตวอยางท ๔-๑ เปนตวอยางโปรแกรมอยางงายทสมบรณท างานไดจรง โปรแกรมนจะพมพคาตวเลขแบบสมโดยอาศยคลาส Random ซงเปนคลาสทใหมาพรอมกบชด JDK

ตวอยางโปรแกรมท ๔-๑ แสดงการสรางออบเจกตอยางงาย 1. import java.util.Random;

2. class Ex4_1 {

3. public static void main(String args[]) {

4. Random randNum;

5. randNum = new Random();

6. System.out.println("Random double value : " +

randNum.nextDouble());

7. System.out.println("Random integer value : " +

randNum.nextInt());

8. }

9. }

ในบรรทดท ๑ มค าสง import ส าหรบบอกคอมไพเลอรวาเราตองการใชคลาสอะไรจากแพคเกจ(package)ใด แพคเกจเปนทรวมของคลาสตาง ๆ ทเตรยมไวใชงานดานใดดานหนง ตวอยางนเราตองการใชคลาส Random จากแพคเกจ java.util เราจ าเปนตองน าเขา (import) คลาสนมาจากภายนอกเนองจากเราไมไดเขยนคลาส Random ขนมาเองในโปรแกรมของเรา java.util เปนชอแพคเกจหนงในบรรดาแพคเกจตาง ๆ ทบรษทซนไมโครซสเตมพฒนาขนและแจกจายไปพรอมกบชด JDK

ในบรรทดท ๔ มการประกาศตวแปรชอวา randNum ใหเปนตวแปรอางองมชนดเปนคลาส Random หมายความวาเราจะใชตวแปรนส าหรบอางองถงออบเจกตทเปนตวอยางหนง(instance)ของคลาส Random

ในบรรทดนเปนเพยงประกาศตวแปร จะไดตวแปรอางองหนงตวเทานน ยงไมมการสรางออบเจกต คาของตวแปร randNum ยงไมไดอางองไปยงออบเจกตใด

บรรทดท ๕ เปนขอความสงส าหรบก าหนดคาใหกบตวแปร randNum โดยน าคาทหาไดจากทางขวาของเครองหมายเทากบไปใสในตวแปร randNum ทางดานขวาของเครองหมายเทากบเปนนพจนท

รปท ๔-๒ แสดงความสมพนธระหวางตวแปรอางองกบออบเจกต

100 ออบเจกต a

ออบเจกต a อยทต าแหนง 100 randNum

Page 7: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

คลาส เมธอดและออบเจกต

7

ประกอบดวยตวด าเนนการ new ซงใชส าหรบสรางออบเจกต ออบเจกตทไดนสรางขนมาโดยใชคลาส

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

ในตอนทายของบรรทดท ๖ มการสงสาร(message)ใหออบเจกต การสงสารใหออบเจกตในภาษาจาวาคอการเรยกใชเมทอด(method) ใดเมทอดหนงของออบเจกต การเรยกอนสแทนซเมทอดใดจากอกออบเจกตหนงนนจ าเปนตองอาศยตวแปรอางองเพอบอกใหรวาเราจะสงสารไปใหออบเจกตใด การเรยกเมทอดโดยผานตวแปรอางองเขยนไดดงน

randNum.nextDouble()

nextDouble เปนชอเมทอดซงมการก าหนดไวในคลาส Random เราสามารถเรยก (call หรอ invoke) เมทอดนไดโดยการบอกชอเตมของเมทอด เนองจากอาจมการสรางออบเจกตของคลาสเดยวกนขนมาหลายตว การเรยกเมทอดโดยระบแตเพยงชอเมทอดจะไมเพยงพอเพราะเกดความก ากวมไมรวาจะเรยกอนสแทนซเมทอดใดกนแน ดงนน การเรยกออบเจกตจากภายนอกออบเจกตของตวมนเองจงจ าเปนตองระบชอเตมของเมทอดนน ชอเตมทสมบรณประกอบดวยคาอางองไปยงทอยของออบเจกตและชอเมทอดคนดวยจด (.) ซงตวอยางในทนชอเตมคอ randNum.nextDouble ความหมายของนพจนนคอ การเรยกเมทอด nextDouble() ของออบเจกตทอางถงโดยตวแปรอางอง randNum เพอความสะดวกและกระชบเราจะเรยกสน ๆ วา เปนการเรยกเมทอด nextDouble() ของออบเจกต randNum

การเรยกเมทอดจดวาเปนนพจน โปรดสงเกตวานพจนเรยกเมทอดจะตองมวงเลบหลงชอเมทอดทถกเรยกเสมอ

เมอมการเรยกเมทอด โปรแกรมจะกระโดดขามไปด าเนนการในเมทอดทถกเรยก เมอท างานในเมทอดทถกเรยกเสรจเรยบรอยแลวจะยอนกลบมาท างานตอจากต าแหนงทถกเรยก บางเมทอดเมอท างานเสรจแลวอาจสงคาขอมลบางอยางกลบมาดวย เมทอด nextDouble เปนเมทอดทใชหาคาตวเลขแบบสม เมอท างานเสรจแลวมนจะสงคาตวเลขทสมไดเปนชนด double กลบมาดวย เราสามารถน าคาทสงกลบมานไปใชงานตอไปได ซงในบรรทดท ๘ มการน าคาทเมทอดสงกลบมาไปตอกบสายอกขระ (string) "Random double value : " ดวยตวด าเนนการตอเชอม (+) แลวสงใหเมทอด System.out.println ท าการพมพออกทางจอภาพ

ในบรรทดท ๗ มการเรยกใชเมทอด nextInt() ของออบเจกต randNum เมทอดนจะคนคากลบมาเปนคาตวเลขสมชนด int ตอจากนนน าไปพมพออกทางจอภาพท านองเดยวกบทท าในบรรทดท ๖

ถาเราคอมไพลและด าเนนการ (run) โปรแกรมนจะไดผลลพธดงตวอยาง: Random double value : 0.6892960397283345

Random integer value : 1421115631

Page 8: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

การสรางโปรแกรมเชงวตถดวยภาษาจาวา

วนชย ขนต ภาควชาระบบสารสนเทศเพอการจดการ คณะพาณชยศาสตรและการบญช มหาวทยาลยธรรมศาสตร 8

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

ตวอยางโปรแกรมท ๔-๒ เปนตวอยางโปรแกรมอยางงายแสดงการสรางออบเจกตของคลาส Date ซงเปนคลาสหนงในแพคเกจ java.util ทใหมาพรอมกบชด JDK

ตวอยางโปรแกรม ๔-๒ แสดงการสรางออบเจกตจากคลาส Date

1: import java.util.Date;

2: class Ex4_1 {

3: public static void main(String args[]) {

4: Date today;

5: today = new Date();

6: System.out.println("Right now is " + today.toString());

7: }

8: }

ในบรรทดท ๑ มค าสง import ส าหรบบอกคอมไพเลอรวาเราตองการใชคลาส Date ทอยในแพคเกจ java.util ในบรรทดท ๔ มการประกาศตวแปรชอวา today ใหเปนตวแปรอางองมชนดเปนคลาส

Date หมายความวาเราจะใชตวแปรนส าหรบอางองถงออบเจกตทเปนตวอยาง(instance)ของคลาส Date

บรรทดท ๕ เปนขอความสงส าหรบก าหนดคาใหกบตวแปร today โดยน าคาทหาไดจากทางขวาของเครองหมายเทากบไปใสในตวแปร today ทางดานขวาของเครองหมายเทากบเปนนพจนทประกอบดวยตวด าเนนการ new ซงใชส าหรบสรางออบเจกตของคลาส Date เมอโปรแกรมท างานมาถงบรรทดนจะไดออบเจกตใหม ๑ ตว คาเลขทอยของออบเจกตนจะถกน าไปใสไวในตวแปร today คลาส Date มตวสรางหลายตวซงแตละตวจะรบอารกวเมนตตางกน จากตวอยางนไมมการสงอารกวเมนตไปใหตวสรางของคลาส Date ดงนนตวสรางตวทไมตองการอารกวเมนตใด ๆ จงถกเรยกใหท างาน ซงตวสรางตวนมหนาทในการก าหนดขอมลภายในออบเจกตใหเปนวนและเวลาปจจบน ณ. ขณะทก าลงสรางออบเจกต สวนบรรทดท 6 มการพมพขอความวา "Right now is " แลวตามดวยขอความทไดจากการเรยกใชเมทอด toString() ของออบเจกตทอางถงโดยตวแปร today เมทอด toString() นเปนเมทอดทก าหนดไวในคลาส Date ใชส าหรบแปลงขอมลภายในออปเจกทใหเปนสายอกขระ (string) เราสามารถเรยกใชอนสแทนซเมทอดใด ๆ

ผานตวแปรอางองไดโดยใชจด (.) เชอมระหวางชอตวแปรอางองกบชอเมทอด ในตวอยางน today.toString() หมายถงการเรยกเมทอด toString() ของออบเจกตทอางองโดยตวแปร today หรอจะพดใหงายและกระชบวาเปนการเรยกเมทอด toString() ของออบเจกต today หลงจากเมทอด toString() ท างานตามหนาทของมนเสรจแลวมนจะสงคากลบคนมาใหเปนขอมลชนดสายอกขระ ผลลพธทไดนจะน าไปตอกบสายอกขระ "Right now is " เนองจากมตวด าเนนการบวก (+) เปนตวตอเชอมสายอกขระทงสองเขาดวยกน โปรแกรมนจงพมพผลลพธดงตวอยาง: Right now is Sun Nov 01 22:09:09 GMT+07:00 1998

Page 9: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

คลาส เมธอดและออบเจกต

9

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

ตวอยางโปรแกรมท ๔-๓ เปนตวอยางการสรางออบเจกตจากคลาส Point ซงเปนคลาสทอยในแพคเกจ java.awt ตวยอ awt ยอมาจาก Abstract Window Toolkit เปนแพคเกจทรวบรวมคลาสทเกยวของกบการเขยนโปรแกรมทท างานแบบวนโดวไวเปนจ านวนมาก ในทนจะหยบยกคลาส Point ซงเปนคลาสเลก ๆเขาใจงายมาเปนตวอยาง คลาสนเปนคลาสทใชก าหนดต าแหนงพกด ๒ มต โดยมการเกบขอมลคาต าแหนงในแนวแกน x และ แกน y และมเมทอดทเกยวของอยจ านวนหนง

ตวอยางโปรแกรม ๔-๓ แสดงการสรางออบเจกตจากคลาส Point 1. import java.awt.Point; 2. class Ex4_2 { 3. public static void main(String args[]) { 4. Point pt; 5. pt = new Point(100, 50); 6. System.out.println( pt.toString() ); 7. pt.translate(50, 60); 8. System.out.println( pt.toString() ); 9. pt.move(200, 150); 10. System.out.println( pt.toString() ); 11. } 12. }

บรรทดท ๔ เปนการประกาศตวแปรชอวา pt เปนตวแปรอางองมชนดเปนคลาส Point ในบรรทดท ๕ มการสรางออบเจกตของคลาส Point โดยสง 100 และ 50 เปนอารกวเมนตไปใหตวสราง ตวสรางจะรบ

100 และ 50 ไปก าหนดเปนคาเรมตนใหตวแปร x และ ตวแปร y ของออบเจกตทสรางขนใหมตามล าดบ

เลขทอยของออบเจกตทไดจะน าไปใสในตวแปร pt

ในบรรทดท ๖ มการเรยกเมทอด toString() ของออบเจกต pt เพอแปลงขอมลภายในออบเจกตใหเปนสายอกขระเพอความสะดวกในการน าไปแสดงผล เมทอด toString() ในทนเปนเมทอดคนละตวกบเมทอด toString() ในคลาส Date ตามตวอยางท ๔-๒ ถงแมจะมชอและหนาทเหมอนกน แตการท างานจะตางกน เราอาจตงชอเมทอดซ ากนไดแตมกใหมความหมายไปในแนวทางเดยวกน โดยทการท างานภายในไมเหมอนกน ถาสงเกต คลาสตาง ๆ จะมเมทอด toString() อยดวยเสมอ ส าหรบวตถประสงคของเมทอดนจะกลาวถงโดยละเอยดอกครงในบทท ๙

บรรทดท ๗ มการเรยกใชเมทอด translate() ของออบเจกต pt เมทอดนจะเลอนต าแหนงของ x และ y ออกไปตามคาของอารกวเมนตทสงไปใหตามล าดบ หลงจากท าเมทอดนแลวคาของ x และ y จะเปลยนไป บรรทดท ๘ เปนการพมพคาภายในออบเจกตออกมาดอกครงเพอดวาคาของมนเปลยนไปอยางไร

บรรทดท ๙ เรยกเมทอด move ของออบเจกต pt เพอก าหนดคา x และ y ใหเปนคาใหมตามอารกวเมนตทสงไปให หลงจากนนในบรรทดท ๑๐ พมพคาของออบเจกตออกมาดอกครง

Page 10: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

การสรางโปรแกรมเชงวตถดวยภาษาจาวา

วนชย ขนต ภาควชาระบบสารสนเทศเพอการจดการ คณะพาณชยศาสตรและการบญช มหาวทยาลยธรรมศาสตร 10

ถาเราคอมไพลและด าเนนการ (run) โปรแกรมนจะไดผลลพธแสดงออกมาดงน java.awt.Point[x=100,y=50]

java.awt.Point[x=150,y=110]

java.awt.Point[x=200,y=150]

ตวอยางท ๔-๔ เปนตวอยางการสรางออบเจกตของคลาส Point อกเชนเดยวกน แตคราวนแสดงใหเหนการเขาถงขอมลในออบเจกต

ตวอยางโปรแกรมท ๔-๔ แสดงการเขาถงขอมลในออบเจกต 1. import java.awt.Point;

2. class Ex4_3 {

3. public static void main(String args[]) {

4. Point pt;

5. pt = new Point(100, 50);

6. System.out.println( "initial x=" + pt.x + " y=" + pt.y );

7. pt.translate(50, -30);

8. System.out.println( "after translation x=" + pt.x +

" y=" + pt.y );

9. pt.x = 200;

10. pt.y = 150;

11. System.out.println( "after change value x=" + pt.x +

" y=" + pt.y);

12. }

13. }

โปรแกรมนแกไขมาจากตวอยางท ๔-๓ ในบรรทดท ๖ แทนทจะใชเมทอด toString() ใหแปลงขอมลภายในออบเจกตใหเปนสายอกขระนน เราใชวธเขาไปดงขอมลในออบเจกตมาใชโดยตรงเสยเอง เราสามารถเขาถงตวแปรในออบเจกตผานตวแปรอางองไดท านองเดยวกบการเรยกใชอนสแทนซเมทอด คลาส

Point มการก าหนดตวแปร x และ y ไวเปนตวแปรสมาชกของคลาส เราเขาใชตวแปรสมาชกเหลานไดจากภายนอกคลาสโดยอาศยตวด าเนนการจดรวมกบตวแปรอางองทอางถงออบเจกตทเราตองการเขาถง ในตวอยางน pt.x หมายถงการเขาถงตวแปร x ของออบเจกตทอางองโดยตวแปร pt หรอจะพดใหสนไดวา เขาถงตวแปร x ของออบเจกต pt การเขาถงเปนไปไดทง ๒ ทางคอจะหยบคาของตวแปรมาใช หรอจะน าคาใหมไปใสในตวแปรกได บรรทดท ๖ ๘ และ ๑๑ เปนการหยบเอาคาของตวแปรสมาชก x และ y ออกมาพมพ สวนบรรทดท ๙ และ ๑๐ เปนการน าคาใหมไปใสในตวแปรสมาชก x และ y ของออบเจกต pt ตามล าดบ

หลงจากคอมไพลและด าเนนการโปรแกรมนแลวจะไดผลลพธทแสดงออกมาดงน initial x=100 y=50

after translation x=150 y=20

after change value x=200 y=150

แพคเกจ

แพคเกจ (package) ในภาษาจาวาหมายถงกลมของคลาสทจดรวมเขาดวยกนไวในสารบบ (directory) เดยวกน การจดแบงกลมของคลาสตาง ๆ ออกเปนแพคเกจชวยใหการจดระเบยบของงานสะดวกขน และชวยแบงแยกระหวางคลาสทเราเขยนขนเองกบทผอนเขยน ภาษาจาวาจะใชชอสารบบเปนชอแพคเกจ ซงชอแพค

Page 11: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

คลาส เมธอดและออบเจกต

11

แกจตองเปนไปตามกฏเกณฑการตงชอตวระบ ดงนนจงเปนการบงคบวาชอสารบบทตงตองเปนไปตามกฏการตงชอตวระบดวย ในกรณทมการมการแบงสารบบเปนสารบบยอย (subdirectory) หลายชนซอนลกลงไปนน จะน าชอสารบบมาเปนชอแพคแกจโดยใชจด(.) เปนตวเชอมระหวางชอสารบบยอย เราเรยกขอแพคเกจทประกอบดวยชอสารบบไลตามล าดบชนแบบนวาชอเตม (fully qualified name)

คลงคลาสจาวามาตรฐาน(standard Java library) เปนทรวมของคลาสตาง ๆ จดแบงหมวดหมเปนหลายแพคเกจ เชน java.lang java.util และ java.net เปนตน แพคเกจมาตรฐานเปนตวอยางของการจดแบงคลาสเปนล าดบชน ท านองเดยวกบการทเราจดสารบบยอยในดสก เราสามารถจดระเบยบแพคเกจโดยการแบงแพคเกจเปนหลายระดบซอนกนเปนชน ๆ แพคเกจมาตรฐานของจาวาทงหมดจดเปนโครงสรางล าดบชนโดยราก(root) หรอจดเรมตนของแพคเกจมชอวา java

เหตผลของการจดแพคเกจซอนเปนชน ๆ กเพอใหมนใจวาชอเตมของแพคเกจจะไมซ ากน สมมตวานายสมชายสรางแพคเกจของเขาขนใชเองและใหชอวา util ถาเขาใสแพคเกจนไวภายใตโครงสรางล าดบชนของแพคเกจเชน somchai.util จะท าใหแพคเกจของเขาไมปะปนและสบสนกบแพคเกจ util ของผอน เราสามารถจดแบงระดบของแพคเกจใหซอนกนไดหลายชน เพอประกนวาจะไมเกดความซ าซอนของชอแพคเกจ บรษทซนไมโครซสเตมสแนะน าใหใชชอโดเมนของบรษทหรอองคการมาเปนสวนประกอบของชอแพคเกจดวย โดยกลบต าแหนงของสวนประกอบของโดเมนยอนหลงแลวน าไปก ากบไวหนาชอแพคเกจ ตวอยางเชนนายสมชายท างานอยทบรษทรวยดซงมชอโดเมนวา goodrich.co.th เขาควรตงชอแพคเกจ ของเขาวา

th.co.goodrich.somchai.util

ซงจะท าใหมนใจไดวาชอแพคเกจทตงขนมานนจะไมซ ากบชอแพคเกจของผอน เพราะวาชอผใช และชอโดเมนมการควบคมไมใหซ ากยดวยการจดทะเบยนนนเอง

การใชแพคเกจ

แพคเกจเปนทรวมของคลาสตาง ๆ เพออ านวยความสะดวกในการน าไปใชงาน ภาษาจาวาจะมการจดหมวดหมของคลาสโดยแยกแยะคลาสไปไวในสารระบบ ตาง ๆ ตามประเภทหรอความสมพนธของคลาส คลาสตาง ๆ ทน ามารวมไวในสารบบเดยวกนถอวาเปนคลาสทอยในแพคเกจเดยวกน เราอางถงคลาสตาง ๆในแพคเกจได ๒ วธ วธแรกคอใสชอเตมของคลาส ตวอยางเชน ถาสรางออบเจกตจากคลาส Random ของแพคเกจ java.util

java.util.Random randNum = new java.util.Random();

การใชวธนดเทอะทะเยนเยอไปหนอยจงไมคอยนยม อกวธทงายและนยมใชมากกวาคอการน าค าส าคญ

import ซงจะท าใหเราอางถงคลาสตาง ๆ โดยไมตองใชชอเตมของแพคเกจกได เราสามารถน าเขา(import)

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

import java.util.Random;

Page 12: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

การสรางโปรแกรมเชงวตถดวยภาษาจาวา

วนชย ขนต ภาควชาระบบสารสนเทศเพอการจดการ คณะพาณชยศาสตรและการบญช มหาวทยาลยธรรมศาสตร 12

เปนการเจาะจงวาเราตองการใชคลาส Random ของแพคเกจ java.util ถาเราใชคลาสเปนจ านวนมากจากแพคเกจน คงไมสะดวกนกทจะเขยนขอความสง import หลายบรรทด เราสามารถเขยนแบบลดโดยใชเครองหมายดอกจนทรชวยไดดงน

import java.util.*;

เครองหมายดอกจนทรหมายถงคลาสอะไรกไดทอยในแพคเกจ เราสามารถใช * ไดกบทละแพคเกจเทานน เราจะใช java.* เพอบอกวาตองการน าเขาทกแพคเกจของ java ไมได

โดยปรกตแลว การน าเขาทกคลาสในแพคเกจเปนเรองงาย ไมมผลในทางลบแตอยางใดไมวาจะเปนเวลาทใชในการคอมไพลหรอขนาดของโปรแกรม ดงนนจงไมมเหตผลใดทจะไมใช แตอยางไรกตาม ถามคลาสชอเดยวกนซ ากนอยในหลายแพคเกจ เราไมสามารถน าเขาพรอมกนได ตองเลยงไปใชชอเตมของคลาสใดคลาสหนงแทนการน าเขา เชน สมมตวาแพคเกจ somchai.util ซงชอซ ากบชอคลาส Date ทอยในแพคเกจ java.util เราจะน าเขาทงสองแพคเกจนพรอมกนในโปรแกรมเดยวกนไมได ตองเลอกวาจะน าเขาแพคเกจใดเพยงแพคเกจเดยวเทานน สมมตวาเราเลอกทจะน าเขาคลาส Date จากแพคเกจ java.util ถาในโปรแกรมเราอางถงคลาส Date โดยไมใชชอเตม จะหมายถงคลาส Date ของแพคเกจ java.util ถาเราตองการใชคลาส Date ในแพคเกจ somchai.util เราตองใชชอเตมวา somchai.util.Date

วธคนหาต าแหนงทอยของแพคเกจ

ทกแฟมของแพคเกจจะตองใสไวในสารบบยอย (subdirectory) ซงเขาคกบชอเตมของแพคเกจ ตวอยางเชนทกแฟมของแพคเกจ somchai.util จะตองเกบไวในสารบบยอย somchai\util (ถาใชระบบปฏบตการ UNIX ตองเกบใน somchai/util)

สารบบยอยไมจ าเปนตองแตกกงออกมาจากสารบบราก (root directory) โดยตรง จะแยกสาขาออกมาจากสารบบใดกได ทงนคอมไพเลอรและอนเทอรพรเตอรของจาวาจะรทอยของสารบบไดจากตวแปรแวดลอม

CLASSPATH สมมตวา ในเครองคอมพวเตอรทใชงานมการระบ CLASSPATH ไวดงตอไปน

CLASSPATH=c:\j2sdk1.4.2\lib;c:\userlib;.

เครองหมายจดตวเดยว (.) หมายถงสารบบปจจบน (current directory)

และสมมตวาในโปรแกรมมขอความสงตอไปน import java.util.*; import somchai.util.*;

ถาตองการใชคลาส Time คอมไพเลอรจะมองหาแฟมชอ Time.class ในสารบบตาง ๆ ทก าหนดใน CLASSPATH ตามล าดบประกอบกบชอแพคเกจดงตอไปน

c:\j2sdk1.4.2\lib\Time.class

c:\j2sdk1.4.2\lib\java\util\Time.class

c:\j2sdk1.4.2\lib\somchai\util\Time.class

Page 13: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

คลาส เมธอดและออบเจกต

13

c:\userlib\Time.class

c:\userlib\java\util\Time.class

c:\userlib\somchai\util\Time.class

.\Time.class

.\java\util\Time.class

.\somchai\util\Time.class

ถาพบแฟมทตองการ คอมไพเลอรจะตรวจสอบตอไปวา ชอแพคเกจเขาคกบชอพาธ (path) หรอไม และภายในแฟมมคลาสสาธารณะชอวา Time อยภายในหรอไม

โดยทจรงแลว ถาเขาไปดในสารบบ(directory) ทเกบคลงคลาสหรอแพคเกจของจาวาทตดตงไวในฮารดดสค เชนถาเขาไปในโฟลเดอร c:\program files\java\ jdk1.7.0\jre\lib จะไมพบสารบบยอย

java.util แตอาจพบแฟมทชอวา rt.jar แฟมสกลนเปนแฟมทไดจากการบบอดแฟมอนหลายแฟมแลวรวมเขาดวยกนเพอใหประหยดเนอทในดสก ถาเราเขาไปดแฟม rt.jar ดวยโปรแกรมส าหรบดแฟม zip เชน WinZip หรอ WinRar จะเหนพาธและแฟมคลาสตาง ๆ อยในนน ชอสารบบและชอแฟมอาจแตกตางกนส าหรบจาวาแตละรน

นอกจากนคอมไพเลอรจาวาจะคนหาแพคเกจ java.lang เสมอไมวาเราจะระบ import java.lang หรอไมกตาม เนองจากแพคเกจนบรรจคลาสตาง ๆ ทจ าเปนของภาษาจาวาเอาไว เรามกใชคลาสใดคลาสหนงจากแพคเกจนเสมอ จาวาจงอ านวยความสะดวกใหเราไมตองระบการน าเขาแพคเกจน

การเขยนคลาส

ในตอนตนของบทนเราไดรจกการสรางออบเจกตจากคลาสทผอนสรางไวใหเราใช ในการเขยนโปรแกรมจาวาเรามกน าคลาสตาง ๆ ทผอนเขยนไวเปนแพคแกจมาใช วตถประสงคหลกของแนวคดการสรางโปรแกรมเชงวตถกคอการใชซ า(reuse) ใชสงทมอยแลว หรอสงทผอนสรางไวแลวใหเกดประโยชนมากทสด ดงนนจงไมใชเรองแปลกทผเขยนโปรแกรมจาวาจะใชคลาสทผอนเขยนไวใหใชมากกวาเขยนคลาสของตนเองขนมาใหม เหตผลส าคญเหตผลหนงทท าใหภาษาจาวาไดรบความนยมอยางรวดเรวกคอการทมคลาสส าเรจรปใหใชเปนจ านวนมากทงจากผคดคนภาษาจาวาคอซนไมโครซสเตม เองและบรษทอนทสรางคลาสตาง ๆ ขนมาแจกฟรหรอขาย ถงแมวาจะมคลาสเปนจ านวนมากใหเราใชกตาม บอยครงทเราจ าเปนหรอควรเขยนคลาสของเราขนใชเอง ในสวนนจะกลาวถงการเขยนคลาสใหมเพอใชงานในโปรแกรมของเรา

ในภาษาจาวา เราใชคลาสในการก าหนดสวนของรหสค าสง โปรแกรมจาวาแตละโปรแกรมจะตองมการก าหนดคลาสอยางนอย ๑ คลาสเสมอ

Page 14: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

การสรางโปรแกรมเชงวตถดวยภาษาจาวา

วนชย ขนต ภาควชาระบบสารสนเทศเพอการจดการ คณะพาณชยศาสตรและการบญช มหาวทยาลยธรรมศาสตร 14

โครงของคลาสมรปแบบดงน

ตวดดแปรคลาสละได class ชอคลาส {

สวนประกาศตวแปรละได

สวนประกาศเมทอดละได

สวนประกาศคลาสละได }

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

ตวดดแปรคลาส (class modifier) เปนค าส าคญ(keyword) ทใสไวหนาค าส าคญ class เพอบงบอกสมบตบางอยางของคลาส ตวดดแปรคลาสแบงเปนตวดดแปรการเขาถง (access modifier) และตวดดแปรอน ๆ เราอาจไมระบตวดดแปรใด ๆ เลยกได หรออาจใสตวดดแปรเพยงตวใดตวหนงหรอหลายตวรวมกนกได แตตองดความหมายของตวดดแปรใหเหมาะสมดวยวาใชรวมกนไดหรอไม ในชวงเรมตนนเราจะยงไมใชตวดดแปรใด เวนแตในตอนทายบทจะกลาวถงตวดดแปรการเขาถง public สวนตวดดแปรนอกเหนอจากนจะกลาวถงในบทอนตอไป

class เปนค าส าคญเพอบงบอกวาเราก าลงก าหนดคลาส

ชอคลาส เปนตวระบ (identifier) ใชตงชอคลาส เราตองตงชอคลาสตามหลกเกณฑการตงชอตวระบ

สวนประกาศตวแปร ใชส าหรบประกาศตวแปรสมาชกของคลาส คลาสหนง ๆ อาจมตวแปรสมาชกไดหลายตวหรอจะไมมตวแปรสมาชกเลยกได กรณทมตวแปรสมาชกหลายตวในคลาสเดยวกน จะประกาศตวแปรใหมชอซ ากนไมได ตวแปรสมาชกตองประกาศไวในขอบเขต ( {…} ) ของคลาส และอยนอกขอบเขตของเมทอด ตวแปรสมาชกจะไดรบการก าหนดคาเรมตนโดยอตโนมตตามชนดของตวแปร ตวแปรชนดตวเลขจะไดรบการก าหนดคาเรมตนใหเปนศนย ตวแปรชนดบล(boolean)จะไดรบการก าหนดคาเรมตนใหเปน false

สวนตวแปรอางองจะไดรบการก าหนดคาเรมตนใหเปน null

สวนประกาศเมทอด หมายถงเมทอดตาง ๆ ทเราเขยนขนมาเปนเมทอดสมาชกของคลาส ในเมทอดจะมขอความสงตาง ๆ ทเราตองการใหเมทอดท างานตามหนาทของมน

สวนประกาศคลาส หมายถงคลาสชนในทเขยนขนมาใหเปนสมาชกของคลาสชนนอก

ภายในวงเลบปกา { } เปนองค(body)ของคลาส ซงจะประกอบดวยสมาชกของคลาสอนไดแกตวแปรสมาชก (member variable) เมทอดสมาชก (member method) และคลาสสมาชก คลาสหนง ๆ จะมเฉพาะตวแปรสมาชก หรอ เมทอดสมาชกอยางใดอยางหนง หรอจะมสมาชกครบทง ๓ อยางกได แตโดยสวน

Page 15: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

คลาส เมธอดและออบเจกต

15

ใหญแลวในคลาสหนง ๆ มกจะมประกอบดวยตวแปรสมาชกและเมทอดสมาชกเปนหลก สวนคลาสสมาชกนนมความจ าเปนในการใชนอยกวาจงยงไมอธบายในบทน แตจะกลาวถงในหวขอคลาสชนในในบทท ๘

หมายเหต เรองของตวดดแปร

ตวดดแปรเปนค าส าคญใชระบเพอใหเปลยนสมบตบางอยางไปจากคาโดยปรยาย คลาส เมทอด และตวแปรสมาชกตางกมตวดดแปรเฉพาะตว แตใชค าส าคญบางค าเปนค าเดยวกน ซงใหความหมายใกลเคยงกน

ตวดดแปรแบงเปนตวดดแปรการเขาถง (access modifier) และตวดดแปรอน ๆ ตวดดแปรการเขาถงใชระบสมบตในการเขาถงคลาส เมทอด และตวแปรวา "ใจกวาง" แคไหน ถาไมไดระบตวดดแปรการเขาถง จะหมายถงใจกวางพอประมาณ ถอวา "เปนมตร(friendly)" กบพวกเดยวกน ยอมใหพวกเดยวกนเขาถงได สวนพวกอนไมยอมใหเขาถง ถาตองการเปลยนระดบความใจกวาง จะตองระบตวดดแปรการเขาถงไวดวย ตวดดแปรการเขาถงมใหใช ๓ ตวดวยกน ตวแรกคอ public หมายถงใจกวางดงมหาสมทรยกใหเปนสมบตสาธารณะใคร ๆ กใชได ไมหวงแตอยางใด ตวทสองคอ protected ท าใจใหแคบลง ใหใชเฉพาะลกหลานทสบเชอสายลงไปเทานน สวนตวสดทายคอ private ใจแคบทสด ใชเปนการสวนตวเทานน แมแตลกหลานกไมยอมใหใช ทเปนเชนนใชวานสยไมด แตบางทจ าเปนตองท า

ตวอยางโปรแกรมท ๔-๕ เปนตวอยางโปรแกรมแสดงการเขยนคลาสอยางงาย โปรแกรมนม ๒ คลาส

คลาสแรกชอ Ex4_5 ส าหรบทดสอบคลาส Time ซงเขยนไวทบรรทด ๑๖ ถง ๑๙ ส าหรบเกบขอมลเวลา ภายในคลาสนมตวแปรสมาชก ๒ ตวคอ hour และ minute ส าหรบเกบคาชวโมงและนาทตามล าดบ

บรรทดท ๓ มการประกาศตวแปรอางองชอวา departureTime มชนดเปนคลาส Time พรอมทงก าหนดคาเรมตนใหเปนเลขทอยของออบเจกตชนด Time ทสรางขนใหม ตวด าเนนการ new ใชส าหรบสรางออบเจกตใหมหนงตว ในกรณนสรางออปเจกทชนดคลาส Time ซงมตวแปรสมาชก ๒ ตว ในขณะทโปรแกรมก าลงท างานเมอมการสรางออบเจกตใหมจะมการหาเนอทวางในหนวยความจ าส าหรบเกบตวแปรสมาชกของคลาส พรอมทงก าหนดคาเรมตนใหกบตวแปรสมาชก กรณนตวแปรสมาชกเปนชนดตวเลขจะถกก าหนดคาเรมตนใหเปนศนยโดยอตโนมต

บรรทดท ๔ และ ๕ เปนการก าหนดคาใหกบตวแปรสมาชกของออบเจกต departureTime สวนบรรทดท ๖ เปนการพมพคาของตวแปรสมาชกออกมาด

บรรทดท ๙ เปนการประกาศตวแปรอางองอกตวใหชอวา arivalTime พรอมทงก าหนดคาเรมตนใหเปนเลขทอยของออบเจกตชนด Time ตวใหมอกตว โปรแกรมนจงมออบเจกต ๒ ตวอสระจากกนอยกนคนละท ตางกมตวแปรสมาชกเปนของตนเองออบเจกตใครออบเจกตมน บรรทดท ๑๐ ก าหนดคาใหตวแปร hour ของออบเจกต arivalTime โปรดสงเกตวาตวอยางนไมมการก าหนดคาใหตวแปร minute ของออบเจกต arivalTime สวนบรรทดท ๑๑ จะพมพคาของตวแปรสมาชก hour และ minute ของออบเจกต arivalTime ออกมา

ตวอยางท ๔-๕ แสดงการสรางคลาสอยางงาย

Page 16: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

การสรางโปรแกรมเชงวตถดวยภาษาจาวา

วนชย ขนต ภาควชาระบบสารสนเทศเพอการจดการ คณะพาณชยศาสตรและการบญช มหาวทยาลยธรรมศาสตร 16

1. class Ex4_5 {

2. public static void main(String args[]) {

3. Time departureTime = new Time();

4. departureTime.hour = 8;

5. departureTime.minute = 30;

6. System.out.println("Departure Time is " +

7. departureTime.hour + ":" + departureTime.minute);

8.

9. Time arivalTime = new Time(); 10. arivalTime.hour = 19;

11. System.out.println("Arival Time is " +

12. arivalTime.hour + ":" + arivalTime.minute);

13. }

14. }

15.

16. class Time {

17. byte hour;

18. byte minute;

19. }

ผลลพธจากการด าเนนการของโปรแกรมนเปนดงน Departure Time is 8:30

Arival Time is 19:0

จะเหนวาคา minute ของออบเจกต arivalTime เปนศนยทง ๆ ทไมมสวนใดของโปรแกรมนก าหนดคาใหตวแปรนเปนศนยเลย เหตทเปนเชนน กเพราะวา ขณะทสรางออบเจกตนขนมานนจะมการก าหนดคาตวแปรสมาชกใหเปนศนยโดยอตโนมตนนเอง

คาโดยปรยายของตวแปรสมาชก

เมอมการจดสรรเนอทในหนวยความจ าส าหรบเกบตวแปรสมาชก จะมการก าหนดคาเรมตนใหตวแปรสมาชกทสรางขนใหมนนโดยอตโนมต คาทก าหนดใหนนเรยกวาคาโดยปรยาย (default value) ซงขนอยกบชนดของตวแปร ตวแปรชนดตวเลขจะไดรบการก าหนดคาเรมตนใหเปนศนย ตวแปรชนดบล (boolean) จะไดรบการก าหนดคาเรมตนใหเปน false สวนตวแปรอางองจะไดรบการก าหนดคาเรมตนใหเปน null ซงมความหมายวาไมไดอางองไปทใดเลย

ในตวอยางท ๔-๕ คลาส Time มแตตวแปรสมาชก ไมมเมทอดสมาชกใด ๆเลย เราอาจใชคลาสแบบนส าหรบสรางออบเจกตตาง ๆ เพอเกบขอมล และอนญาตใหมการเขาถงขอมลเหลานนจากคลาสอนได ตวอยางนมการเขาถงขอมลของออบเจกตชนด Time จากคลาส Ex4_5 การเขาถงตวแปรสมาชกจากภายนอกคลาสของมนจ าเปนตองระบตวแปรอางองเสมอ ออบเจกตทสรางจากคลาส Time ในตวอยางนถอวาเปน ออบเจกตทท างานดวยตวเองไมได (passive object) โดยทวไปแลวคลาสทเราสรางขนมกจะมเมทอดสมาชกรวมอยดวยเพอใหออบเจกตทสรางขนเปนออบเจกตทสามารถท างานไดดวยตวเอง (active object)

Page 17: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

คลาส เมธอดและออบเจกต

17

การก าหนดเมทอด

เราสามารถก าหนดใหมเมทอดอยในคลาสของเราเพอท าหนาทตาง ๆ ตามทเราตองการ รปแบบของการก าหนดเมทอดมรปแบบเปนดงน

ตวดดแปรเมทอดละได ชนดของคาสงกลบ ชอเมทอด (รายการพารามเตอรละได) {

สวนประกาศตวแปรและขอความสงตาง ๆ }

ชอเมทอด เปนตวระบ(identifier)ทตงขนมาเพอใชอางถงในการเรยกใชเมทอด ชอทตงตองเปนไปตามกฏเกณฑการตงชอตวระบ

ชนดของคาสงกลบ(return type)เปนชนดของขอมลผลลพธทจะสงกลบไปใหผเรยกเมทอด เราสามารถระบชนดของขอมลทจะสงกลบโดยระบชอชนด (type) ของขอมล หรอ ชอคลาสท านองเดยวกบการประกาศตวแปร คาทสงคนจากเมทอดมไดเพยงคาเดยวเทานน หรอจะไมสงคาใด ๆกลบเลยกได ถาไมมความจ าเปนทจะสงขอมลกลบใหใชค าส าคญ void แทนทชนดของคาสงกลบ

รายการพารามเตอร(parameter list)เปนรายการของตวแปรทประกาศขนในเมทอดใชส าหรบรบคาขอมลตาง ๆ ทผเรยกสงมาใหในขณะทเรยกเมทอด เมทอดอาจมหรอไมมพารามเตอรกได ถามพารามเตอรหลายตว จะคนพารามเตอรแตละตวดวยจลภาค (comma) ถาเมทอดไมมการรบคาพารามเตอรใด ๆ เลย ยงจ าเปนตองมวงเลบอยเสมอแตจะเวนในวงเลบใหวางไว พารามเตอรเปนตวแปรทประกาศไวในวงเลบหลงชอเมทอด การประกาศพารามเตอรจะตองมชนดขอมลน าหนาชอตวแปรทท าหนาทเปนพารามเตอรเสมอ ถามพารามเตอรหลายตวชอเหลานจะซ ากนไมได พารามเตอรถอวาเปนตวแปรเฉพาะบรเวณ ใชไดเฉพาะภายในเมทอดทก าหนดมนขนมาเทานน

ตวดดแปรเมทอด(method modifier) เปนค าส าคญ(keyword)ทใชก าหนดสมบตของเมทอด ตวดดแปรเปนตวเลอกเราสามารถละไมเขยนกได เราอาจเขยนตวดดแปรมากกวาหนงตวไวหนาชนดของคาสงกลบกได เทาทผานมาเรารจกตวดดแปรมาบางแลวคอค าส าคญ public ซงเปนตวดดแปรใหเมทอดมสมบตเปนสาธารณะสามารถเรยกใชจากคลาสอนได และค าส าคญ static ทใชส าหรบก าหนดสมบตของเมทอดใหเปนเมทอดสถต(static method) หรอเรยกอกอยางวาคลาสเมทอด(class method) ซงไมขนกบออบเจกตใด อนจะท าใหสามารถเรยกใชเมทอดไดโดยไมตองสรางออบเจกตขนมา

การประกาศตวแปรและขอความสง บรรจอยในวงเลบปกกาประกอบขนเปนองคของเมทอด (method body) หรอเรยกอกอยางวาบลอก ซงท าหนาทเปนขอความสงประกอบ(compound statement) ทรวมเอาขอความประกาศตวแปรและขอความสงส าหรบท างานตาง ๆ ไวภายใน ขอความประกาศตวแปรเปนขอความทใชส าหรบประกาศชอและชนดของตวแปรทใชภายในเมทอด ตวแปรตาง ๆทใชในเมทอดตองมการประกาศ

Page 18: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

การสรางโปรแกรมเชงวตถดวยภาษาจาวา

วนชย ขนต ภาควชาระบบสารสนเทศเพอการจดการ คณะพาณชยศาสตรและการบญช มหาวทยาลยธรรมศาสตร 18

มากอนลวงหนาจงจะสามารถอางองใชงานได ภายในบลอกของเมทอดอาจมบลอกยอยซอนอยภายในไดอกหลายบลอกถาตองการ แตไมสามารถสรางเมทอดใหซอนอยภายในเมทอดใด ๆไดเลย

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

return นพจน

ในการสงขอมลกลบไปยงผเรยก เมอโปรแกรมท างานมาถงขอความสง return นพจนหลงค าส าคญ

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

ตวอยางท ๔-๖ เปนโปรแกรมทดดแปลงมาจากตวอยางท ๔-๕ โดยทแทนทจะใหเขาถงตวแปรสมาชกของคลาส Time จากคลาสอนโดยตรง คราวนเราจะสรางเมทอดขนมาเพอใชในการเขาถงตวแปรสมาชก ในคลาส Time มการก าหนดเมทอด setHour ขนมาทบรรทด ๑๙ เมทอดนเขยนขนมาเพอรบคาชวโมงไปใสในตวแปรสมาชก hour ดงนนจงตงตวพารามเตอรขนมา ๑ ตวเพอรบคาชวโมงทผเรยกสงมาให พารามเตอรตวนใหชอวา h มชนดเปน int เมทอดนไมไดสงคาใด ๆกลบไปยงผเรยกจงใสค าส าคญ void ไวหนาชอเมทอด ภายในเมทอดนมขอความสง ๑ ขอความคอ hour = (byte)h; เพอน าคาชวโมงทรบมาอยพารามเตอร h ไปใสไวในตวแปรสมาชก hour แตเนองจากมขนาดทแตกตางกน ตวแปรสมาชก hour มขนาดเลกกวาพารามเตอร h จงจ าเปนตองหลอหลอม (cast) คาของตวแปร h ซงเปนชนด int ใหเปนชนด byte เสยกอนจงจะน าคาทไดไปใสในตวแปรสมาชก hour ความจรงแลวเราสามารถก าหนดใหตวพารามเตอร h เปนชนด byte เสยกได แตเวลาเรยกเมทอดนเราตองสงพารามเตอรใหเปนชนด byte ดวย ซงหากเราสงคาคงทเปนตวเลขไปใหเมทอดนแลวละก เราตองหลอหลอมคาตวเลขคงทนนใหเปนชนด byte อยด เชนถาจะเรยกเมทอด setHour โดยการสงพารามเตอรเปนคาคงท 8 ตามตวอยางในบรรทดท ๔ เราตองเขยนการเรยกเมทอดดงน

departureTime.setHour( (byte) 8 );

ซงหากมการเรยกเมทอดท านองนหลายครงจะท าใหยงยากและเสยเวลาในการเขยนโปรแกรมใหมการหลอหลอมอยเสมอ ดงนนเราจงใหเมทอด setHour รบพารามเตอรเปนชนด int เพอความสะดวก และท าการหลอหลอมพารามเตอรนเพยงครงเดยวกอนน าขอมลไปใสในตวแปรสมาชก hour

ส าหรบเมทอด setMinute ในบรรทดท ๒๐ มการท างานท านองเดยวกนกบเมทอด setHour สวนเมทอด getHour ในบรรทดท ๒๑ เขยนขนมาเพอสงคาของตวแปรสมาชก hour ไปใหผเรยกเมทอดน เมท

Page 19: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

คลาส เมธอดและออบเจกต

19

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

เนองจากเราตองการใหเมทอดนสงคากลบไปดวยเมอท างานเสรจ ดงนนเราจงตองก าหนดชนดของตวแปรทตองการสงกลบไปดวยซงในทนคอ byte สวนภายในเมทอดไมไดท าอะไรมากเพยงแคสงคาของตวแปรสมาชก hour กลบออกมาดวยขอความสง return hour; เทานน ในขณะทเมทอดนท างาน เมอท างานมาถงขอความสง return มนจะยตการท างานภายในเมทอดพรอมทงสงคาของตวแปรสมาชก hour กลบออกมาดวย ส าหรบเมทอด getMinute ในบรรทดท ๒๒ คลายคลงกบเมทอด getHour

ตวอยางท ๔-๖ นมการก าหนดเมทอดส าหรบรบคาเปนพารามเตอรแลวน าไปใสในตวแปรสมาชกซงท าใหสถานะของออบเจกตเปลยนไป เมทอดทท าหนาทแบบนเรยกวาตวเปลยน (mutator) หรอ ตวตงคา

(setter) เมทอดชนดนนยมตงชอขนตนดวยค าวา set สวนเมทอดทใชส าหรบสงคาขอมลภายในออบเจกตออกมาใหผเรยกเราเรยกวา ตวเขาถง (accessor) หรอ ตวสอบถามคา (getter) เมทอดประเภทนนยมตงชอขนตนดวยค าวา get

ขอควรปฎบต ขอนยมในการตงชอคลาสและเมทอด

ชอคลาสนยมขนตนดวยอกษรโรมนตวใหญ ควรหลกเลยงการใชชอซ ากบชอคลาสในแพคเกจตาง ๆ ของ JDK เพอปองกนความสบสน

ชอเมทอดนยมขนตนดวยอกษรโรมนตวเลก ถาเปนเมทอดทท าการเปลยนคาของตวแปรสมาชกนยมตงน าหนาดวยค าวา set ถาเปนเมทอดทคนคาของตวแปรสมาชก นยมขนตนดวย get

ในคลาส Ex4_6 มการใชคลาส Time แตคราวนไมมการเขาถงตวแปรสมาชกของคลาส Time โดยตรงเหมอนดงในตวอยางท ๔-๕ แตจะใชตวเปลยนและตวเขาถงแทน บรรทดท 4 และ 5 ใชตวเปลยน

setHour และ setMinute ในการก าหนดชวโมงและนาทใหออบเจกต departureTime สวนบรรทดท ๗ มการใชตวเขาถงส าหรบสงคาตวแปรสมาชก hour และ minute ของออบเจกต departureTime ออกมาแสดงทางจอภาพ

ส าหรบผลลพธจากการด าเนนการของโปรแกรมนไดผลลพธเหมอนกบผลลพธทไดจากตวอยางท ๔-๕

ตวอยางท ๔-๖ แสดงคลาสซงมตวเปลยนและตวเขาถง 1. class Ex4_6 {

2. public static void main(String args[]) {

3. Time departureTime = new Time();

4. departureTime.setHour(8);

5. departureTime.setMinute(30);

6. System.out.println("Departure Time is " +

7. departureTime.getHour() + ":" +

departureTime.getMinute());

8.

9. Time arivalTime = new Time();

Page 20: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

การสรางโปรแกรมเชงวตถดวยภาษาจาวา

วนชย ขนต ภาควชาระบบสารสนเทศเพอการจดการ คณะพาณชยศาสตรและการบญช มหาวทยาลยธรรมศาสตร 20

10. arivalTime.setHour(19);

11. System.out.println("Arival Time is " +

12. arivalTime.getHour() + ":" +

arivalTime.getMinute() );

13. }

14. }

15.

16. class Time {

17. byte hour;

18. byte minute;

19. void setHour(int h) { hour = (byte)h; }

20. void setMinute(int m) {minute = (byte)m; }

21. byte getHour() { return hour; }

22. byte getMinute() { return minute; }

23. }

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

ขอดของการใชเมทอดตวเปลยนและเมทอดตวเขาถงคอ ท าใหผใชคลาสไมจ าเปนตองสนใจในรายละเอยดวาขอมลในคลาสเกบอยางไร ตวแปรชออะไร เปนตวแปรชนดไหน ใหผใชคลาสรแตเพยงวาตองสงพารามเตอรอะไรไปใหตวเปลยนบาง และรวาจะรบขอมลอะไรชนดใดกลบมาจากตวเขาถง ผใชรแคนกเพยงพอ เปนการซอนขอมลทแทจรงไวภายในคลาสตามหลกการซอนขอมล(information hiding) ผใชคลาสไมจ าเปนตองรวาขอมลในคลาสเกบอยางไร จะเกบอยางไรนนเปนเรองภายในทผใชไมจ าเปนตองทราบ การท าอยางนนอกจากท าใหผใชไมตองศกษาโครงสรางขอมลภายในคลาสแลว ยงมประโยชนทส าคญคอ หากมความจ าเปนตองปรบเปลยนวธการจดเกบขอมลภายในคลาส ผเขยนคลาสมกไมจ าเปนตองเปลยนวธเรยกตวเปลยนและตวเขาถง ซงจะไมกระทบตอผใชคลาส ถงแมจะมการเปลยนแปลงวธการจดเกบขอมลภายในคลาสกตาม

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

การรกษาหลกการนไวเปนเรองส าคญ มฉะนนแลวผใชคลาสโดยเฉพาะผอนซงอาจมการใชคลาสทมการปรบแกภายในนเปนจ านวนมากตองแกไขโปรแกรมตามไปดวย สแกไขเปนการภายในคลาสเพยงอยางเดยวจะดกวา ดงนนถาไมจ าเปนจรง ๆ แลว เราจะไมเปลยนวธการเรยกตวเปลยนและตวเขาถง แตจะเปลยนเฉพาะโครงสรางขอมลและค าสงทอยภายในตวเปลยนและตวเขาถงเพอใหสอดคลองกบการจดเกบขอมลทเปลยนไปเทานน หากการเปลยนแปลงการจดเกบขอมลจ าเปนตองกระทบตวเปลยนและตวเขาถงอยางหลกเลยงไมได เราอาจเขยนตวเปลยนและตวเขาถงตวใหมเพมขนแตยงคงเกบรกษาตวเปลยนและตวเขาถงตวเดมไวถาท าได ทงนเพอรกษาความเขากนได (compatibility) เอาไวนนเอง

Page 21: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

คลาส เมธอดและออบเจกต

21

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

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

ตวอยางท ๔-๖ ถงแมวาคลาส Time จะมเมทอดใหเรยกใชงานกตามแตเปนเมทอดตวเปลยนและเมทอดตวเขาถงเทานน ยงไมมเมทอดทท างานใหเปนชนเปนอนทแทจรง คราวนเรามาสรางเมทอดใหคลาสนท างานไดมากขน สมมตวาเราตองการใหออบเจกตของคลาสนมความสามารถในการค านวณบวกเพมเวลาไดดวยตวของมนเอง เราจะเขยนเมทอดส าหรบบวกเพมชวโมงชอวา addHour เมทอดส าหรบบวกเพมนาทชอวา addMinute และเมทอดส าหรบแสดงเวลาชอวา print ตวอยางท ๔-๗ เปนตวอยางทเราเพมเมทอดทงสามนใหกบคลาส Time นอกจากนยงมการปรบปรงเมทอดตวเปลยน setHour และ setMinute ใหสามารถตรวจสอบขอมลดวยวาพารามเตอรทผเรยกสงมาใหนนถกตอง อยในชวงตวเลขทรบไดหรอไม

ตวอยางท ๔-๗ คลาส Time ทปรบปรงใหมความสามารถมากขน 1. class Ex4_7 {

2. public static void main(String args[]) {

3. Time arivalTime = new Time();

4. arivalTime.setHour(19);

5. arivalTime.setMinute(30); arivalTime.print();

6. arivalTime.addHour(3); arivalTime.print();

7. arivalTime.addMinute(45); arivalTime.print();

8. arivalTime.addMinute(45); arivalTime.print();

9. arivalTime.addMinute(1); arivalTime.print();

10. }

11. }

12.

13. class Time {

14. byte hour;

15. byte minute;

16. boolean setHour(int h) {

17. if ( h >=0 && h <= 24 ) {

18. hour = (byte)h;

19. return true;

20. } else

21. return false;

22. }

23. boolean setMinute(int m) {

24. if ( m >=0 && m < 60 ) {

Page 22: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

การสรางโปรแกรมเชงวตถดวยภาษาจาวา

วนชย ขนต ภาควชาระบบสารสนเทศเพอการจดการ คณะพาณชยศาสตรและการบญช มหาวทยาลยธรรมศาสตร 22

25. minute = (byte)m;

26. return true;

27. } else

28. return false;

29. }

30. byte getHour() { return hour; }

31. byte getMinute() { return minute; }

32. void addHour(int dh) {

33. int h;

34. h = hour + dh;

35. if ( h >= 24 ) {

36. hour = (byte)(h % 24);

37. return;

38. }

39. hour = (byte)h;

40. }

41. void addMinute(int dm) {

42. int m;

43. m = minute + dm;

44. if ( m >= 60 ) {

45. minute = (byte)(m % 60);

46. addHour( m / 60 );

47. } else

48. minute = (byte)m;

49. }

50. void print() {

51. if ( hour == 0 && minute == 0)

52. System.out.println("24:0");

53. else

54. System.out.println(hour + ":" + minute);

55. }

56. }

เมทอด setHour และ setMinute ไดรบการปรบปรงใหตรวจสอบความถกตองของพารามเตอรทรบมากอนทจะน าคาไปใสในตวแปรสมาชก hour และ minute เมทอดเหลานจะท าการตรวจสอบขอมลทรบมาเปนพารามเตอรวามคาอยในชวงตวเลขทถกตองหรอไม ถาถกตองจะท างานตอไปจนจบแลวสงคาชนด boolean เปน true กลบออกไปถาคาของพารามเตอรไมถกตองจะไมท าอะไรนอกจากสงคา false กลบไปเปนสญลกษณบอกผเรยกใหทราบวาท างานไมส าเรจเพราะพารามเตอรไมถกตอง บรรทดท ๑๗ ใชขอความสง if ตรวจสอบวาพารามเตอร h มคาอยระหวาง 0 ถง 24 ใชหรอไม ถาใช จะน าคาของ h ไปใสในตวแปรสมาชก hour แตเนองจากพารามเตอร h เปนชนด int ซงใหญกวา hour ทเปนชนด byte ดงนนจงจ าเปนตองหลอหลอมคาของ h ใหเปนชนด byte เสยกอนจงจะน าไปใสตวแปร hour เปนอนเสรจภาระหนาทไมตองท าอะไรตอไปแลวจง ยอนกลบไปยงผเรยกโดยขอความสง return พรอมทงสงคา true กลบออกไปดวยเพอบอกใหผเรยกรวาเมทอดนท างานส าเรจ

การทเมทอดจะคนคาใดกลบไปนนขนอยกบผเขยนโปรแกรมวาจะก าหนดใหเปนคาใด ในกรณนผเขยนโปรแกรมตองการบอกใหผเรยกใชเมทอดทราบวาเมทอดท างานส าเรจหรอไมเพยงเทานน จงสามารถคนคาเปนชนด boolean ไดอยางเพยงพอ โดยทวไปแลวเรานยมคนคาเปน true หมายถงท าหนาทไดส าเรจถกตอง การคนคาเปน false หมายถงการท างานไมส าเรจ ซงในทนหมายถงพารามเตอรทรบมามคาอยนอกชวง

Page 23: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

คลาส เมธอดและออบเจกต

23

ตวเลขทเหมาะสม ดงนนถาพารามเตอรทรบมามคานอกชวง 0 - 24 จะไมมการน าพารามเตอรนไปใสในตวแปร hour แตจะเลกท างานในเมทอดพรอมทงคนคาเปน false เพอบอกใหผเรยกทราบวาคาพารามเตอรทสงมานนไมถกตอง สวนเมทอด setMinute มหลกการตรวจสอบและท างานคลายกบเมทอด setHour ตางกนแตเพยงคาตวเลขทตรวจสอบเทานน ส าหรบเมทอดนจะตรวจสอบวาคานาททสงมาเปนพารามเตอรนนมคาอยระหวาง 0 ถง 59 หรอไม

เมทอด addHour ท าหนาทในการบวกเพมคาของชวโมง โดยน าคาจากพารามเตอร dh ไปบวกเพมในตวแปรสมาชก hour เพอความสะดวกในการท างานภายในเมทอดจงก าหนดตวแปรใหมขนมา ๑ ตว ใหชอวา h เปนชนด int ส าหรบใชในการเกบพกขอมลชวโมงเปนการชวคราว ตวแปร h ถอวาเปนตวแปรเฉพาะท(local variable) ใชไดเฉพาะภายในเมทอด addHour นเทานน บรรทดท ๓๔ น าคาพารามเตอร dh บวกเขากบตวแปรสมาชก hour แลวน าผลลพธทไดจากการบวกไปเกบไวทตวแปร h บรรทดท ๓๕ ตรวจสอบวาคาชวโมงทบวกกนแลวนนมคามากกวาหรอเทากบ 24 หรอไม ถามากวาหรอเทากบ 24 จรง จะท ากลมขอความสงในวงเลบปกกาซงถอเสมอนหนงวาเปนเพยง ๑ ขอความสงของ if กลมขอความสงในทนหมายถงบรรทดท ๓๖ และ ๓๗ บรรทดท ๓๙ ท าการหลอหลอมคาของ h จาก int ใหเปน byte แลวน าไปเกบในตวแปรสมาชก hour

เมทอด addMinute ในบรรทดท ๔๑ ถง ๔๙ ท าหนาทในการเพมคาของตวแปรสมาชก minute ขนตามคาของพารามเตอร หลกการท างานคลายกบเมทอด addHour แตมเพมตรงทถาคาของ m ซงเกบนาทมคามากกวาหรอเทากบ 60 จะตองทดใหกบหลกชวโมงและลดคาของนาท

ผลลพธจากการท างานของตวอยางท ๔-๗ เปนดงน 19:30

22:30

23:15

24:0

0:1

การปกปองขอมล

การอนญาตใหคลาสอนเขามาแกไขขอมลในออบเจกตไดโดยตรงเปนสงทไมดนก เพราะในบางครงออบเจกตควรจะรบทราบวาขอมลภายในออบเจกตก าลงจะเปลยน เพอจะไดด าเนนการใด ๆ ใหเหมาะสม การเปลยนแปลงขอมลใด ๆ ของออบเจกตจงควรกระท าโดยเมทอดตวเปลยน ถงแมวาจะมเมทอดตวเปลยนใหผใชคลาสใชแลวกตาม แตถายงปลอยผใชคลาสสามารถเปลยนแปลงแกไขขอมลในออบเจกตไดเองโดยตรงแลวละก นบวาเปนอนตรายเปนอยางยง หลกการหนงทส าคญของแนวคดการสรางโปรแกรมเชงวตถคอการหอหม (encapsulation) ซงเปนการปองกนขอมลในออบเจกตไมใหโปรแกรมจากภายนอกเขามาแกไข หลกการนเปรยบเสมอนวาขอมลเปนแกนกลางอยภายในและมเมทอดเปนเปลอกหอหมอยดานนอกคอยปองกนไมใหผอนเขาใชขอมลโดยตรง ขอมลจะเขาถงไดโดยเมทอดของมนเองเทานน

Page 24: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

การสรางโปรแกรมเชงวตถดวยภาษาจาวา

วนชย ขนต ภาควชาระบบสารสนเทศเพอการจดการ คณะพาณชยศาสตรและการบญช มหาวทยาลยธรรมศาสตร 24

จาวามวธการปองกนขอมลในออบเจกต เราสามารถปกปองขอมลจากการเขาถงจากภายนอกออบเจกตไดโดยใชตวดดแปรการเขาถง(access modifier) ชวย ตวดดแปรการเขาถงเปนค าส าคญทใชระบพรอมกบการประกาศ คลาส เมทอด หรอตวแปร เพอบอกคอมไพเลอรถงสมบตของการเขาถงอยางทเราตองการ

ถาเราตองการปองกนไมใหคลาสอนเขาถงตวแปรสมาชกของคลาสโดยตรง เราควรระบตวดดแปรตวแปร (variable modifier) ไวหนาชนดของตวแปรสมาชก ตวดดแปรทควรใชคอ private จากตวอยางท ๔-๕ และ ๔-๖ ถาเราตองการปองกนตวแปรสมาชก hour และ minute เราควรประกาศตวแปรทงสองนดงน

private byte hour; private byte minute;

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

อนสแทนซเมทอดและคลาสเมทอด

เมทอดทแสดงในตวอยางทผานมาในบทนลวนแลวแตเปนอนสแทนซเมทอดทงสน อนสแทนซเมทอดจ าเปนตองเรยกโดยอาศยตวแปรอางองทอางองไปยงออบเจกตทตองการเรยก ในบางกรณเราตองการใหเมทอดท างานอะไรบางอยางโดยทไมเกยวกบออบเจกตของคลาสตวมนเองเลย จงไมนาทจะตองสรางออบเจกตขนมากอนเพยงเพอจะเรยกใชเมทอดนน จาวาอนญาตใหท าอยางนไดโดยตองสรางเปนคลาสเมทอด เราสามารถประกาศคลาสเมทอดไดโดยเพมค าส าคญ static ไวหนาชนดของคาสงกลบ ค าส าคญ static เปนหนงในตวดดแปรเมทอด ใชส าหรบบงบอกสมบตของเมทอดวาเปนเมทอดทอยกบคลาสตายตว ในการประกาศเมทอด ถาไมมค าส าคญ static ปรากฏอยหนาชอเมทอดถอวาเมทอดนนเปนอนสแทนซเมทอด ตวอยางท ๔-๘ มเมทอด starLine เปนคลาสเมทอด ตวอยางท ๔-๙ มคลาสเมทอดชอวา maxOfThree จะเหนวามการเรยกใชเมทอดทงสองนโดยไมมการสรางออบเจกตแตอยางใด

การเรยกเมทอด

เมทอดจะท างานกตอเมอมการสงใหมนท า การสงใหเมทอดท างานเรยกวาการเรยกเมทอด (method call หรอ method invocation) เมทอดอาจถกเรยกใชมาจากขอความสงทอยในตวเมทอดของมนเอง หรอเรยกจากเมทอดอนในคลาสเดยวกน หรอจะถกเรยกมาจากคลาสอนกได การเรยกเมทอดจะระบชอเมทอดและอาจใหขอมลตาง ๆ แกเมทอดทจะถกเรยกตองการใชในการท างานตามหนาทของมน หากมการเรยกเมทอดทอยตางออบเจกตกน คอมการเรยกเมทอดของอกออบเจกตหนงจากออบเจกตหนง จ าเปนระบตวแปรอางองหรอทอยของออบเจกตปลายทางทเราตองการเรยกดวย ซงการเรยกเมทอดผานทางตวแปรอางองโดยมจด (.) เปนตวคนระหวางชอตวแปรอางองกบชอเมทอด นนไดกลาวถงไปแลว กรณทเมทอดทตองการเรยกเปนเมทอด

Page 25: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

คลาส เมธอดและออบเจกต

25

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

การเรยกเมทอดจะท าใหล าดบการท างานของโปรแกรมไมเปนไปตามล าดบทตอเนอง เมอมการเรยกเมทอด ล าดบการท างานของโปรแกรมจะเปลยนไป จะมการกระโดดจากจดทมการเรยกเมทอดไปท างานตามขอความสงทอยในเมทอดทถกเรยก เมอเมทอดทถกเรยกใชท าหนาทของมนเสรจสนแลว โปรแกรมจะยอนกลบไปท างานตอทต าแหนงหลงจดทเรยกเมทอดนนมา ถาเมทอดทถกเรยกนนมการสงคาขอมลกลบไปดวย (โดยใชขอความสง return และชนดของคาทสงกลบ จะตองไมเปน void) จดทมการเรยกเมทอดนนสามารถน าคาทเมทอดสงออกไปมาใชได ในกรณนการเรยกเมทอดจะท าตวเสมอนตวแปรซงเราสามารถเอาคาของมนไปใชได

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

ตวอยางท ๔-๘ เปนตวอยางเมทอดทมการท างานภายในเมทอด แตไมมการสงคาใด ๆ คนกลบไปยงผเรยก 1: class Ex4_8 {

2: public static void main(String args[]) {

3: E4_8.starLine(50);

4: System.out.println("Would you like to drink Java?");

5: starLine(60);

6: }

7: static void starLine(int n) {

8: while (n-- > 0)

9: System.out.print('*');

10: System.out.println("");

11: }

12: }

บรรทดท ๗ ถง ๑๑ เปนเมทอดทเขยนขนโดยใหชอวา starLine เมทอดนตองการพารามเตอรหนงตวคอ n เปนตวแปรชนดจ านวนเตม ค าส าคญ void ทเขยนไวหนาชอเมทอดบอกใหรวาเมทอดนจะไมสงคาใด ๆกลบคนไปใหผเรยก เมทอดนจะพมพดอกจนทรตามจ านวน n ทผเรยกสงมาโดยใชขอความสง while ส าหรบควบคมการท าซ า ใหท าบรรทดท ๙ ซ าจ านวน n เทยว (ขอความสง while จะกลาวถงโดยละเอยดในบทท ๙) เมอวนท าซ าครบตามจ านวนแลว จะออกจากการท าซ าไปท าขอความสงหลงชดของ while คอบรรทดท ๑๐ เมอท างานเสรจแลวจะกลบคนไปสผเรยกโดยไมสงคาอะไรกลบคนไปเลย การเรยกเมทอดนจดแรกอยท

Page 26: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

การสรางโปรแกรมเชงวตถดวยภาษาจาวา

วนชย ขนต ภาควชาระบบสารสนเทศเพอการจดการ คณะพาณชยศาสตรและการบญช มหาวทยาลยธรรมศาสตร 26

บรรทดท ๓ นพจน Ex4_8.starLine(50) เปนการเรยกเมทอด starLine พรอมทงสงคาจ านวนเตม 50 ไปใหเมทอดนดวย จดทสองทมการเรยกเมทอดนคอนพจน starLine(60) ในบรรทดท ๕ โปรดสงเกตวา การเรยกเมทอดนบรรทดท ๓ มชอคลาส Ex4_8 ก ากบไวหนาชอเมทอดดวย สวนบรรทดท ๕ ไมมเนองจากเปนการเรยกเมทอดจากภายในคลาสเดยวกน จงไมตองใสชอคลาสกได แตถาตองการเรยกเมทอดนจากคลาสอนจ าเปนตองระบชอคลาสดวยเสมอ ตวอยางนแสดงใหเหนวาเราจะระบชอคลาสไวหนาชอเมทอดหรอไมกไดถาเปนการเรยกเมทอดจากภายในคลาสของมนเอง

ความจรงแลว บรรทดท ๒ กเปนการก าหนดเมทอดเชนเดยวกน เมทอดนมชอวา main เราคนเคยกบการเขยนเมทอดท านองนมาแลวโดยทอาจไมรวามนคอเมทอด เมทอด main เปนเมทอดทมความหมายพเศษ

เมทอดนจะถกเรยกใชงานเปนอนดบแรกในโปรแกรมของเรา ผเรยกใชเมทอดนกคอจาวาอนเทอรพรเตอรนนเอง

เมทอด main ตองการพารามเตอรชนด String ซงจะอธบายในบทท ๙ ยงไมตองใสใจในตอนน ขอใหใชตามตวอยางไปกอน เมทอด main สนสดทบรรทดท ๖ สวนรางของเมทอดนม ๓ บรรทดเรมตงแตบรรทดท ๓ ถงบรรทดท ๕ โปรแกรมนเรมตนท างานตงแตบรรทดท ๓ เปนตนไป บรรทดท ๓ มนพจน

starLine(50) ซงเปนการเรยกเมทอด starLine โดยสงคาจ านวนเตม 50 ไปใหเมทอดนดวย ณ จดน ทซงมการเรยกเมทอด ล าดบการท างานของโปรแกรมจะเปลยนไป โปรแกรมจะกระโดดขามไปท างานในบรรทดท ๘ ซงอยในเมทอด starLine ขณะทเรมเขามาท างานในเมทอด starLine นนน ตวแปร n จะมคาเปน 50 ตามทผเรยกสงมาให ดงนนเมทอด starLine จะพมพดอกจนทรจ านวน 50 ตว แลวจงท าขอความสงในบรรทดท ๑๐ ซงเปนการพมพบรรทดใหม ตอจากนนจะไปทบรรทดท ๑๑ พบวาจบบลอกของเมทอด starLine เปนอนเสรจสนการท างานในเมทอดน โปรแกรมจะยอนกลบไปท างานตอจากบรรทดท ๓ ซงในบรรทดท ๔ จะมการพมพค าวา "Would you like to drink Java?" ออกมา ตอจากนนจงไปท างานในบรรทดท ๕ ซงเปนการเรยกเมทอด starLine อกครงหนงแตคราวน สงคา 60 เปนพารามเตอร โปรแกรมจะเปลยนล าดบการท างาน กระโดดไปท างานในเมทอด starLine อกครง เมอท างานเสรจกจะยอนกลบมาท างานตอไปในบรรทดท ๖ แตปรากฎวาบรรทดท ๖ ไมมขอความสงใดเลย มแตวงเลบปกกาปด นนหมายถงวาการท างานในเมทอด main กสนสดลงดวย โปรแกรมจะไมไปท างานในบรรทดท ๗ ซงอยถดมา แตจะยอนกลบไปยงผทเรยกเมทอดนมาซงกคอกลบไปยงจาวาอนเทอรพรเตอรนนเอง เปนการจบสนการท างานของโปรแกรมน

ตวอยางท ๔-๙ เปนตวอยางการเขยนเมทอดทมการสงคาคนกลบไปยงผเรยกดวย ตวอยางนจะเขยนเมทอดชอวา MaxOfThree ขนมากอน แลวจงตามดวยเมทอด main ถงแมวาจะเขยนเมทอด MaxOfThree ขนมาเปนอนดบแรกกตาม แตโปรแกรมนไมไดเรมตนท างานทเมทอดน ยงคงเรมตนท างานทเมทอด main อยดถงแมวาจะเขยนไวอนดบหลงกตาม เพราะวาจาวาอนเทอรพรเตอรจะเรมตนโดยการเรยกใชเมทอด main เสมอ

Page 27: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

คลาส เมธอดและออบเจกต

27

ตวอยางท ๔-๙ เมทอดทมการสงคาคนกลบไปยงผเรยก

1: class Ex4_9 {

2: static int maxOfThree(int x, int y, int z)

3: {

4: int max = x;

5:

6: if (y > max)

7: max = y;

8: if (z > max)

9: max = z;

10: return max;

11: }

12: public static void main(String args[]) {

13: int a=10, b=20, c=30, d=40;

14: int max;

15: max = maxOfThree( a, b, c );

16: System.out.println("The largest value is " + max );

17:

18: max = maxOfThree( a, b, c) + d;

19: System.out.println("Result of the expression is " + max);

20: }

21: }

ตวอยางท ๔-๙ น เมทอด maxOfThree ตองการพารามเตอรจ านวน ๓ ตว แตละตวเปนชนดจ านวนเตม เมทอดนมการสงคากลบไปใหผเรยกเปนขอมลชนดจ านวนเตมดไดจากค าส าคญ int ทอยหนาชอเมทอด เมอมการระบวาเมทอดนจะสงคากลบไปยงผเรยก ภายในเมทอดจะตองมขอความสง return แลวตามดวยนพจนทใหผลลพธเปนขอมลชนดเดยวกบทระบไวหนาชอเมทอด ในบรรทดท ๑๐ มขอความสง return max ไวส าหรบบงคบใหโปรแกรมยอนกลบไปยงผเรยกพรอมทงสงคาของ max ไปใหผเรยกดวย

โปรแกรมนเรมตนท างานทเมทอด main โดยเรมตนทบรรทดท ๑๓ ซงมการประกาศตวแปร a b c และ d พรอมทงก าหนดคาเรมตนใหแกตวแปรเหลานเปน 10 20 30 และ 40 ตามล าดบ การเรยกเมทอด maxOfThree เรมแรกในนพจน max = maxOfThree( a, b ,c )ในบรรทดท ๑๕ การเรยกเมทอดในครงนมการสงคาของตวแปร a b และ c ซงมคาเปน 10 20 และ 30 ตามล าดบไปใหเมทอด maxOfThree

จากจดทมการเรยกเมทอดน โปรแกรมจะกระโดดไปท างานยงเมทอด maxOfThree เมอท างานเสรจแลวจะยอนกลบมายงจดนอกครงพรอมทงคาผลลพธเปนจ านวนเตมซงมคาสงทสดจากทง ๓ ตวทสงเปนพารามเตอรไปให ซงในทนกคอ 30 คา 30 นจะเปนผลของการเรยก maxOfThree(a, b, c) ซงเปนนพจนทางขวาของตวด าเนนการก าหนดคา (=) ดงนนจงน าคา 30 ไปใสไวในตวแปรทางซายของตวด าเนนการก าหนดคาคอตวแปร max เปนผลใหหลงจากท างานในบรรทดท ๑๕ ผานไปแลว max จะมคาเปน 30

การเรยกเมทอด maxOfThree เขยนไวอกทในบรรทดท ๑๘ ประกอบดวยการเรยกเมทอด maxOfThree โดยสงคาของ a b และ c เปนพารามเตอร ซงจะสงคา 10 20 และ -30 ไปใหเมทอด MaxOfThree เมทอด maxOfThree กจะรบคาทง ๓ นมาหาคาสงสดซงไดแก 30 ดงนนจงสงคา 30 กลบไป

Page 28: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

การสรางโปรแกรมเชงวตถดวยภาษาจาวา

วนชย ขนต ภาควชาระบบสารสนเทศเพอการจดการ คณะพาณชยศาสตรและการบญช มหาวทยาลยธรรมศาสตร 28

ใหผเรยกในบรรทดท 18 สงผลให maxOfThree(a, b, c) ในบรรทดท ๑๘ หลงจากท าเมทอด maxOfThree แลวมคาเปน 30 ดงนนหลงจากท างานในเมทอด maxOfThree เรยบรอย แลวในบรรทดท ๑๘

จงมความหมายเหมอนกบ max = 30 + d; ดงนนเมอสนสดการท างานในบรรทดนแลว max จะมคาเปน

70

การสงผานขอมลไปใหเมทอด

ในการเรยกเมทอดทมการรบคาพารามเตอรดวยนน กอนทโปรแกรมจะกระโดดไปท างานยงเมทอดทก าลงจะถกเรยก จะมการหาคาผลลพธของนพจนทระบอยในรายการพารามเตอรทจะสงไปใหเมทอด นพจนทวานอาจประกอบดวยคาคงท ตวแปร หรอการเรยกเมทอดอยางใดอยางหนงหรอหลายอยางรวมกนโดยมตวด าเนนการเปนตวเชอม หากมพารามเตอรทจะสงไปใหเมทอดหลายตว ตองคนนพจนของแตละพารามเตอรดวยจลภาค (,) ผลลพธของนพจนเหลานจะถกประเมนคาตามล าดบจากซายไปขวา แลวสงคาทไดนไปเกบในตวแปรพารามเตอรของเมทอด หลงจากนนโปรแกรมจงจะกระโดดไปท างานในเมทอดทถกเรยก กรณทระบตวแปรไวในวงเลบของการเรยกเมทอด เชน MaxOfThree(a, b, c) จะมการท าส าเนาคาของตวแปร (ในกรณตวอยางนคอ a b และ c) ไปใหเมทอด ซงหากเมทอดจะท าการเปลยนแปลงคาของพารามเตอรไปอยางไรกตามจะไมมผลกระทบตอคาของตวแปรตนตอ a b และ c ทสงไปใหเมทอดแตอยางใด สงผานพารามเตอรไปใหเมทอดวธนเรยกวาสงผานโดยคา (pass by value) คอสงเฉพาะคาของตวแปรไปเทานน เมทอดไมไดเขามาใชตวแปรโดยตรง แตใชส าเนาของมน

ตวแปรอตโนมต

ตวแปรและพารามเตอรซงประกาศไวในเมทอดจดวาเปนตวแปรเฉพาะท(local variable) ตวแปรและพารามเตอรเหลานจะเกดขนโดยอตโนมต (เรยกวาตวแปรอตโนมต - automatic variable) ไมไดเกดขนพรอมกบการสรางออบเจกต แตจะมตวตนเกดขนโดยอตโนมตเมอโปรแกรมเขาสการท างานในเมทอดหรอบลอกทประกาศตวแปรเหลานน ตวแปรเหลานจะมอาย (duration หรอ lifetime) อยระยะหนงเฉพาะชวงเวลาทโปรแกรมท างานอยในเมทอดทสรางมนขนมาเทานน เมอโปรแกรมเรมเขามาท างานในบลอกทมการประกาศตวแปรอตโนมต ตวแปรเหลานจงจะถกสรางขนมาในหนวยความจ าและคงอยไปตลอดเวลาตราบใดทยงท างานค าสงตาง ๆอยภายในบลอกทประกาศตวแปรนนขนมา เมอท างานในบลอกเสรจสนแลว โปรแกรมจะออกไปท างานทอนนอกบลอก ตวแปรอตโนมตตาง ๆทสรางขนมาในบลอกนจะถกท าลายไปดวย เปนอนสนสดอายขยของตวแปรเหลานนไปโดยอตโนมต การใชตวแปรแบบนท าใหประหยดหนวยความจ าเพราะวาพนทในหนวยความจ าจะถกจบจองส าหรบเกบขอมลกตอเมอโปรแกรมเขาไปท างานในบลอกทประกาศมนขนมา และเมอโปรแกรมออกจากบลอกทประกาศมนขนมาแลวหนวยความจ าทเกบตวแปรประเภทนจะถกคนใหกบระบบ

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

Page 29: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

คลาส เมธอดและออบเจกต

29

เองทจะตองก าหนดคาเรมตนใหกอนทจะน าตวแปรไปใช หากมไดก าหนดคาใหกบตวแปรกอนน าไปใช คอมไพเลอรจะไมยอมใหผาน คอมไพเลอรจะฟองวา “ตวแปรอาจยงไมไดรบการก าหนดคาเรมตน” (“Variable ... may not have been initialized”) ซงเปนกลไกหนงของจาวาทปองกนการหลงลมการก าหนดคาใหตวแปรกอนใชงาน หากไมปองกนเชนน อาจเกดขอผดพลาดในโปรแกรมโดยทผเขยนโปรแกรมไมรตวและหาทผดไดยาก

ขอบเขตของตวแปร

ขอบเขต(scope)ของตวแปรใด ๆ หมายถงสวนใดสวนหนงของโปรแกรมทสามารถอางองถงตวแปรนนได เชนเมอมการประกาศตวแปรเฉพาะทขนมาในบลอกหนงแลว ตวแปรนสามารถอางถงไดเฉพาะภายในบลอกเดยวกนนหรอบลอกทซอนลงชนในเทานน

เราสามารถประกาศตวแปรขนมาใชเปนการเฉพาะภายในบลอกตาง ๆได ถามบลอกซอนกนอยหลายชน

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

การซ าชอเมทอด

ภาษาจาวายอมใหมการตงชอคลาสเมทอดเดยวซ ากนได ตราบใดทเมทอดเหลานมชดพารามเตอรทแตกตางกน(แตกตางกนโดยจ านวนพารามเตอร หรอ ชนดของพารามเตอร หรอล าดบของพารามเตอร) เมทอดหลายเมทอดทใชชอเดยวกนนเรยกวาการซ าชอเมทอด(method overloading) เมอมการเรยกเมทอดทมการซ าชอ คอมไพเลอรจาวาจะเลอกเมทอดทเหมาะสมไดถกตวโดยดจากจ านวน ชนด และล าดบของพารามเตอรทใชเรยก เมทอดทใชชอซ ากนเหลานอาจมชนดของขอมลทจะสงกลบ(return type)แตกตางกนกได ความแตกตางของขอมลสงกลบจะไมมผลตอการเลอกเมทอดแตอยางใด พารามเตอรเทานนทใชในการเปรยบเทยบเพอเลอกวาจะเรยกเมทอดใด โดยทวไปแลวเรามกสรางเมทอดทใชชอเดยวกนหลาย ๆตวทท าหนาทคลายกน แตจะแตกตางกนทชนดของขอมลทตองการกระท า

ตวอยางท ๔-๑๐ เปนตวอยางการซ าชอเมทอด ตวอยางนมการสรางเมทอดชอ square ขนมา ๒ ตว ตวแรกมพารามเตอร ๑ ตวเปนชนด int ตวท ๒ มพารามเตอร ๑ ตวเปนชนด double ในบรรทดท ๖ มการเรยกเมทอด square พรอมกบสงคาของตวแปร y ซงเปนจ านวนเตมไปให คอมไพเลอรจะรไดวาเราตองการ

Page 30: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

การสรางโปรแกรมเชงวตถดวยภาษาจาวา

วนชย ขนต ภาควชาระบบสารสนเทศเพอการจดการ คณะพาณชยศาสตรและการบญช มหาวทยาลยธรรมศาสตร 30

เรยกเมทอด square ตวทตองการพารามเตอรเปน int ซงเมทอดตวนเขยนไวเรมตงแตบรรทดท ๑๐ สวนบรรทดท ๗ มการเรยกเมทอด square อกครงหนง แตคราวนสงพารามเตอรเปน z ซงมคาเปนชนด double ดงนนคราวนคอมไพเลอรจะเรยกเมทอด square อกตวหนงซงเรมบรรทดท ๑๔

ตวอยางท ๔-๑๐ การซ าชอเมทอด

1: class MethodOverload {

2: public static void main (String args[]) {

3: int y=5;

4: double z = 25.0;

5:

6: System.out.println("The square of " + y + " is "

+ square(y));

7: System.out.println("The square of " + z + " is "

+ square(z));

8: }

9:

10: static int square(int x) {

11: return x * x;

12: }

13:

14: static double square(double x) {

15: return x * x;

16: }

17: }

ผลลพธจากการท างานของโปรแกรมเปนดงน The square of 5 is 25

The square of 25 is 625.0

ตวสราง

เมอมการสรางออบเจกตใหมขนมา เรามกตองการท าอะไรบางอยางในชวงเรมตนของการสรางออบเจกต เชนท าการก าหนดคาเรมตนใหกบขอมลในออบเจกต การท างานอะไรบางอยางเพอเตรยมความพรอมกอนทออบเจกตจะถกเรยกใชในครงตอ ๆไป การทจะใหออบเจกตใด ๆ ท างานบางอยางในชวงเรมตนชวตของมน เราสามารถท าไดโดยเขยนงานทตองการใหท าใสไวในเมทอดใดเมทอดหนงแลวหาโอกาสเรยกเมทอดนน จาวามวธการอ านวยความสะดวกในการเรยกเมทอดทมวตถประสงคน โดยการก าหนดใหมเมทอดพเศษซงจะถกเรยกโดยอตโนมตเมอมการสรางออบเจกตใหม เมทอดพเศษทวานเรยกวาตวสราง(constructor)

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

Page 31: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

คลาส เมธอดและออบเจกต

31

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

รปแบบของการเขยนตวสรางเปนดงน

ชอตวสราง (รายการพารามเตอรละได) {

การประกาศตวแปรและขอความสงตาง ๆ }

ชอตวสราง คอชอเมทอดตองใชชอเดยวกบชอคลาสเสมอ

รายการพารามเตอร คอตวแปรตาง ๆ ทตงขนมาเพอรบพารามเตอรทผเรยกสงมาให (คอมไพเลอรเรยกใหแทนผเขยนโปรแกรม) รายการพารามเตอรเปนเพยงตวเลอกเทานนจะมหรอไมมกไดแลวแตความจ าเปนวาตองการใหผเรยกสงขอมลมาใหตวสรางหรอไม

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

ผเขยนโปรแกรมอาจเขยนตวสรางของแตละคลาสขนมาหลายตวกได แตตองมจ านวนหรอชนดของพารามเตอรทแตกตางกนตามหลกการซ าชอเมทอด การทคลาสหนง ๆมตวสรางไดหลายตวเรยกวาการซ าชอตวสราง (constructor overloading)

ตวอยางท ๔-๑๑ เปนโปรแกรมทดดแปลงมาจากตวอยางท ๔-๗ โดยเพมตวสรางของคลาส Time เขาไป ๒ ตว ใหตวสรางตวแรกรบพารามเตอร ๑ ตวเปนคาตวเลขชวโมงทตองการก าหนดใหกบออบเจกต สวนตวสรางตวทสองรบพารามเตอร ๒ ตว คอชวโมงและนาท ตวสราง ๒ ตวนท าหนาทก าหนดคาเรมตนใหกบตวแปรสมาชก hour และ minute ถาตองการก าหนดคาเรมตนให hour เพยงอยางเดยวโดยตองการให minute เปนศนย การก าหนดคาเรมตนใหตวแปรสมาชก ตวสรางสามารถเปลยนคาไดเอง แตในตวอยางนมการเรยกใชเมทอด setHour และ setMinute ใหท าแทนใหเนองจากเมทอดทงสองมการตรวจสอบความถกตองของพารามเตอรดวย ตวสรางจงไมตองตรวจสอบเอง นกเขยนโปรแกรมสามารถก าหนดคาเรมตนใหตวแปร hour และ minute ไวในวงเลบหลงชอคลาสหลงตวด าเนนการ new ไดเลย ซงถาจะวาไปแลว มนมรปแบบเหมอนกบการเรยกเมทอดนนเอง นกเขยนโปรแกรมสามารถสงใหเรยกตวสรางตวแรกไดโดยใส

Page 32: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

การสรางโปรแกรมเชงวตถดวยภาษาจาวา

วนชย ขนต ภาควชาระบบสารสนเทศเพอการจดการ คณะพาณชยศาสตรและการบญช มหาวทยาลยธรรมศาสตร 32

พารามเตอรเพยงตวเดยวดงตวอยางทบรรทด ๒ ถาตองการก าหนดคาเรมตนทงชวโมงและนาท สามารถสรางออบเจกตไดตามตวอยางในบรรทดท ๕

ตวอยางท ๔-11 แสดงคลาสทมการซ าชอตวสราง 1. class Ex4_11 {

2. public static void main(String args[]) {

3. Time time1 = new Time(4);

4. time1.print();

5. Time time2 = new Time(8, 30);

6. time2.print();

7. // Time time3 = new Time(); // default constructor no longer

valid

8. }

9. }

10.

11. class Time {

12. byte hour;

13. byte minute;

14. Time(int h) {

15. setHour(h);

16. minute = 0;

17. };

18. Time(int h, int m) {

19. setHour(h);

20. setMinute(m);

21. }

22. boolean setHour(int h) {

23. if ( h >=0 && h <= 24 ) {

24. hour = (byte)h;

25. return true;

26. } else

27. return false;

28. }

29. boolean setMinute(int m) {

30. if ( m >=0 && m < 60 ) {

31. minute = (byte)m;

32. return true;

33. } else

34. return false;

35. }

36. byte getHour() { return hour; }

37. byte getMinute() { return minute; }

38. void addHour(int dh) {

39. int h;

40. h = hour + dh;

41. if ( h >= 24 ) {

42. hour = (byte)(h % 24);

43. return;

44. }

45. hour = (byte)h;

46. }

47. void addMinute(int dm) {

48. int m;

49. m = minute + dm;

50. if ( m >= 60 ) {

Page 33: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

คลาส เมธอดและออบเจกต

33

51. minute = (byte)(m % 60);

52. addHour( m / 60 );

53. } else

54. minute = (byte)m;

55. }

56. void print() {

57. if ( hour == 0 && minute == 0)

58. System.out.println("24:0");

59. else

60. System.out.println(hour + ":" + minute);

61. }

62. }

โปรดจ าไววา ตวสรางถกเรยกโดยตวด าเนนการ new เทานน เราไมสามารถเรยกตวสรางโดยตรงไดเอง ดงนนเราจงไมสามารถเรยกใชตวสรางกบออบเจกตเกาทเกดขนแลวเพอก าหนดคาใหมใหกบตวแปรสมาชกอกครงหนงได ตวอยางเชน ถาเราจะเปลยนเวลาของออบเจกต time1 ใหเปน 10 นาฬกา 30 นาท จะเรยกตวสรางใหเปลยนเวลาใหดวยวธการตอไปนไมได

time1.Time(10, 30)

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

เมอเราเขยนตวสรางตวใดตวหนงของคลาสใด ๆ ขนมา คอมไพเลอรจะไมสรางตวสรางโดยปรยายของคลาสนนใหอกตอไป ดงนน การสรางออบเจกตตามตวอยางในบรรทดท ๗ จงท าไมไดอกตอไป ทง ๆ ทกอนทเราจะเขยนตวสรางยงท าไดอย หากเรายงคงตองการสรางออบเจกตโดยไมสงพารามเตอร เราจ าเปนตองเขยนตวสรางทไมรบพารามเตอรขนเอง เชนตวอยางตอไปน

Time( ) {

hour = 0;

minute = 0;

}

หากไมอยากเขยนตวสรางทไมตองการพารามเตอรลกษณะนขนมา เราอาจเลยงไปสรางออบเจกตดวยขอความสงดงตอไปน

Time time3 = new Time(0, 0);

หรอ Time time3 = new Time(0);

ทดแทนได

ตวแปรอนสแทนซและตวแปรคลาส

ตวแปรสมาชก hour และ minute ของคลาส Time ในตวอยางท ๔-๕ ถง ๔-๗ เปนตวแปรอนสแทนซทงสน ตวแปรอนสแทนซถอวาอยกบออบเจกต จะเกดขนกตอเมอมการสรางออบเจกตขนมา ออบเจกต

Page 34: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

การสรางโปรแกรมเชงวตถดวยภาษาจาวา

วนชย ขนต ภาควชาระบบสารสนเทศเพอการจดการ คณะพาณชยศาสตรและการบญช มหาวทยาลยธรรมศาสตร 34

แตละตวจะมตวแปรอนสแทนซเปนของตนเองอสระจากออบเจกตอน สมมตวามการสรางออบเจกตของคลาส

Time ๑๐ ครง จะไดตวแปรสมาชก hour และ minute ๑๐ ชดตามจ านวนออบเจกตทสรางขน เมอมตวแปรชอเดยวกนอยในหลายออบเจกตเชนน จงเลยงไมพนทจะตองระบวาเราจะใชตวแปรอนสแทนซใด ดงนนการเขาถงตวแปรเหลานจงตองใชควบคกบตวแปรอางอง เวนเสยแตวาอางองจากภายในออบเจกต(คลาส) ตวมนเอง ไมตองใชตวแปรอางองใด ๆ

ตวแปรอนสแทนซเกดมาคกบออบเจกต เมอไมมการใชออบเจกตอกตอไป ระบบจะท าลายออบเจกตใหเอง ตวแปรอนสแทนซกจะสนสดลงดวย ไมสามารถใชตวแปรนนไดอกตอไป

ตวแปรคลาสตางจากตวแปรอนสแทนซคอไมเกบอยทออบเจกตแตเกบไวทคลาสและมอยชดเดยวเทานน

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

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

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

เราสามารถประกาศตวแปรสมาชกใหเปนตวแปรคลาสไดโดยเขยนค าส าคญ static ไวหนาชนดของตวแปรสมาชก ตวอยางเชนคลาส Abc ตอไปน

class Abc {

int a; // a is a instance variable

static int b; // b is a class variable

}

ตวแปรสมาชก a เปนตวแปรอนสแทนซ สวนตวแปรสมาชก b เปนตวแปรคลาส เราสามารถเขาถงตวแปรคลาสไดโดยใชชอคลาสน าหนาชอตวแปรสมาชก เชน Abc.b

ตวอยางท ๔-๑๒ เปนตวอยางแสดงการใชตวแปรคลาสควบคกบตวแปรของเมทอด ตวอยางนแสดงใหเหนคลาส Dice ซงมตวแปรสมาชก ๒ ตว ตวแรกชอวา count เปนตวแปรคลาส ตวท ๒ ชอวา face เปนตวแปรอนสแทนซ ตวแปร count ใชนบจ านวนออบเจกตของคลาส Dice ทสรางขนมาแลว ตวแปรนจะถกเพมคาทละ 1 ทกครงทตวสรางของคลาส Dice ท างาน สวนตวแปร face ใชเกบเลขหนาทออกของ

Page 35: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

คลาส เมธอดและออบเจกต

35

ลกเตาแตละลกซงมคาทเปนไปไดระหวาง 1 ถง 6 เนองจากอาจมการสรางออบเจกตลกเตาหลายลก แตละลกจงควรเกบขอมลหนาทออกเปนของตนเอง ดงนนจงใชเปนตวแปรอนสแทนซ สวนตวแปร count ใชนบจ านวนลกเตาทงหมดทสรางขน ควรมตวแปรนนเพยงตวเดยว จงก าหนดใหเปนตวแปรคลาส

เมทอด toss ท าหนาทก าหนดคาใหตวแปร face โดยใชคลาส Random ชวยในการสรางเลขแบบสม

เนองจากลกเตาม ๖ หนา จงน าเลขสมทไดมาหาเศษเหลอจากการหารดวยตวด าเนนการ % คาทไดเปนเลขอยระหวาง 0 ถง 5 แตอาจมคาเปนลบได จงใชขอความสง if ตรวจสอบวาเปนลบ (นอยกวาศนย) หรอไม ถานอยกวาท าใหเปนบวกโดยใชตวด าเนนการลบ (-) ตอจากนนบวกดวย 1 เพอท าใหคาเปลยนเปนอยระหวาง 1

ถง 6 ตามทตองการ

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

ตวอยางท ๔-๑๒ แสดงการใชตวแปรคลาส 1. import java.util.Random;

2. class Ex4_12 {

3. public static void main(String args[]) {

4. System.out.println("Initial number of dices = " +

5. Dice.getNumberOfDices() );

6.

7. Dice d1 = new Dice();

8. System.out.println("Total number of dices = " +

9. Dice.getNumberOfDices() );

10. System.out.println("Current face of dice 1 is " + d1.face);

11.

12. Dice d2 = new Dice();

13. System.out.println("Total number of dices = " +

14. Dice.getNumberOfDices() );

15. System.out.println("Current face of dice 2 is " + d2.face);

16.

17. Dice d3 = new Dice();

18. System.out.println("Total number of dices = " +

19. Dice.getNumberOfDices() );

20. System.out.println("Current face of dice 3 is " + d3.face);

21.

22. System.out.println("Total number of dices = " +

23. d1.getNumberOfDices() );

24. d3.toss();

25. System.out.println("Current face of dice 3 is " + d3.face);

26. }

27. }

28.

29. class Dice {

30. static int count; // number of dices created

31. byte face;

32. Dice() {

33. count++;

34. toss();

Page 36: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

การสรางโปรแกรมเชงวตถดวยภาษาจาวา

วนชย ขนต ภาควชาระบบสารสนเทศเพอการจดการ คณะพาณชยศาสตรและการบญช มหาวทยาลยธรรมศาสตร 36

35. }

36. void toss() {

37. Random randNum = new Random();

38. int x = randNum.nextInt() % 6;

39. if (x < 0)

40. x = -x;

41. face = (byte) ++x;

42. }

43. static int getNumberOfDices() { return count; }

44. }

ผลลพธจากการท างานของโปรแกรมตวอยางท ๔-๑๒ แสดงในกรอบสเหลยมตอไปน จะเหนวา Total number of dices มคาเพมขนทกครงทมการสรางออบเจกตของลกเต าตวใหม สวน Current

face of dice จะมคาไมแนนอนในการด าเนนการของโปรแกรมแตละครง เนองจากค านวณมาจากเลขสม Initial number of dices = 0

Total number of dices = 1

Current face of dice 1 is 2

Total number of dices = 2

Current face of dice 2 is 2

Total number of dices = 3

Current face of dice 3 is 3

Total number of dices = 3

Current face of dice 3 is 4

คาอางอง this

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

แตละออบเจกตสามารถเขาถงตวแปรสมาชกของมนโดยอางชอตวแปร ส าหรบตวแปรสมาชกจะมชอเตมของมนคอ this.member เมอ this คอคาอางองทชไปยงออบเจกตปจจบน (current object)ทบรรจตวแปรสมาชกนนอย สวน member หมายถงชอสมาชกทตองการเขาถง ถาไมมความก ากวมเรองชอแลวไมจ าเปนตองใช this กได โดยทวไปแลวเราใช this ในกรณทตวแปรเฉพาะทหรอพารามเตอรของเมทอดมชอซ ากบชอตวแปรสมาชกซงก าหนดไวในคลาส เมอเปนเชนนจ าเปนตองอางถงตวแปรสมาชกดวยชอเตมโดยการใสค าน าหนา this ลงไปดวยเพอบงบอกวาตองการใชตวแปรสมาชกของคลาสไมใชตวแปรเฉพาะท

ตวอยางท ๔-๑๔ ตวสรางในบรรทดท ๑๑ มพารามเตอรชอ hour ซงซ าชอกบตวแปรสมาชก ถาเราใชชอ hour โดยไมมค าน าหนาชอก ากบไวดวย จะหมายถงตวแปรทประกาศไวใกลตวทสดคอตวแปรเฉพาะท hour ไมใชตวแปร hour ซงเปนสมาชกของออบเจกต ดงนนเพอไมใหก ากวมจงตองระบ this ไวหนาตวแปร hour ทหมายถงตวแปรสมาชก

Page 37: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

คลาส เมธอดและออบเจกต

37

ในบางครงเราตองการเขาถงออบเจกตปจจบนในฐานะของออบเจกตโดยรวม ไมใชตวแปรสมาชกตวใดตวหนงเปนการเฉพาะ จาวามวธการอยางยอใหใชอยางสะดวกโดยใชคาอางอง this ชวย ถาใชในเมทอด ค าส าคญ this อางถงออบเจกตทเมทอดนนก าลงด าเนนการอย

ตวอยางเชน คลาสของจาวาจ านวนมากมเมทอดทชอ toString() ส าหรบแปลงขอมลในออบเจกตใหอยในรปสายอกขระ สมมตวาคลาสของเรามเมทอดนอยดวย เราสามารถพมพขอมลในออบเจกตอยางงาย ๆ

ลกษณะตอไปนได System.out.println( this );

การท าเชนนใชประโยชนไดมากโดยเฉพาะอยางยงในการคนหาจดบกพรอง(debug) ของโปรแกรม

เพราะผลลพธจากการเรยกเมทอด toString() คอสายอกขระทไดมาจากการแปลงขอมลตาง ๆ ทอยในออบเจกต ซงจะน าไปแสดงผลไดโดยสะดวก ท าใหเรารวาในขณะทเรยกเมทอด toString() นน ในออบเจกตมคาขอมลเปนอยางไรบาง

ค าส าคญ this มอกความหมายคอ ถาขอความสงแรกของตวสรางอยในรป this(…) หมายถงใหตวสรางเรยกตวสรางตวอนอกตวของคลาสเดยวกน ดงตวอยางในบรรทดท ๑๘ ของตวอยางท ๔-๑๓ this ในทนเปนการเรยกตวสรางทรบพารามเตอร ๒ ตว ซงอยทบรรทด ๑๗ แทนทเราจะเขยนตวสรางเองทงหมดเราอาจเรยกใชตวสรางตวอนกได ตวอยางนตองการอ านวยความสะดวกใหนกเขยนโปรแกรมทใชคลาสน ถาตองการใหนาทของออบเจกตใหมเปนศนยแตไมอยากใหนกเขยนก าหนดนาทใหเปนศนยใหยงยาก จงเขยนตวสรางอกตวใหรบพารามเตอรเฉพาะชวโมง สวนขอมลนาทตวสรางก าหนดใหเปนศนยเอง แตแทนทจะเขยนตวสรางอกตวทท าหนาทครบถวนเบดเสรจในตวเอง เราไปเรยกใชตวสรางอกตวซงเขยนไวแลว วธนท าใหโปรแกรมกระชบ ลดขอยงยากหากมการแกไขโปรแกรมในภายหลง ถาดในตวอยางนอาจไมเหนความจ าเปนทจะตองเรยกใชตวสรางอกตว เพราะไมเหนตวสรางท าอะไรทซบซอน จะเขยนตวสรางขนมาใหมอกตวไมใชเรองหนกหนาอะไร แตโดยขอเทจจรงแลว โปรแกรมทใชงานจรงมความซบซอนกวานหลายเทานก ตวอยางนพยายามไมใหโปรแกรมดยงยากเพอใหงายแกการท าความเขาใจ หากเปนโปรแกรมทใชงานจรงแลว การก าหนดขอมลใหตวแปรสมาชกควรมการตรวจสอบความถกตองของขอมลดวย เชนไมยอมใหชวโมงมคาเกน

24 เปนตน การเรยกใชตวสรางทมอยแลวใหเปนประโยชนจงชวยในการเขยนโปรแกรมเปนอยางมาก ทงนในการออกแบบตวสรางควรแบงหนาทใหด จงจะเรยกใชกนไดโดยไมท างานซ าซอน

การใช this(hour, 0) ดเหมอนวาจะเปนการเรยกเมทอด Time(hour, 0) แตความจรงแลวไมใชเสยทเดยว ตวสรางเปนอะไรทซบซอนกวาเมทอดทวไป กอนทเมทอดจะถกเรยก ตวแปรอนสแทนซจะตองถกก าหนดคาเรมตนตามทเราระบหรอไมกถกก าหนดใหเปนคาเรมตนโดยปรยายตามแตชนดของตวแปร ดวยเหตนภาษาจาวาจงบงคบใหเราเรยกตวสรางเปนอนดบแรกในเมทอดกอนทจะไปท าขอความสงอนใด หากคอมไพเลอรอนญาตใหเราท าขอความสงอนกอนได อาจเกดขอผดพลาดอยางรายแรงได เนองจากตวแปรสมาชกยงไมไดรบการก าหนดคาเรมตน เราอาจน าคาทผดไปใช หรอถาเราท าการเปลยนแปลงคาของตวแปรสมาชกไปแลว ถาเราเรยกตวสรางทหลงไดจรง ตวสรางจะท าการก าหนดคาเรมตนของตวแปรสมาชกภาย

Page 38: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

การสรางโปรแกรมเชงวตถดวยภาษาจาวา

วนชย ขนต ภาควชาระบบสารสนเทศเพอการจดการ คณะพาณชยศาสตรและการบญช มหาวทยาลยธรรมศาสตร 38

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

ถาเปลยน this(hour, 0) ใหเปน Time(hour, 0) แลวคอมไพลใหม คอมไพเลอรจะแจงวาไมพบเมทอด Time เปนการปองกนไมใหผเขยนโปรแกรมเรยกใชตวสรางไดเองโดยตรง

ตวอยางท ๔-๑๓ แสดงการใชคาอางอง this 1. class Ex4_13 {

2. public static void main(String args[] ) {

3. Time TG234Time = new Time(18,30);

4. Time TG456Time = new Time(15);

5.

6. TG234Time.print();

7. TG456Time.print();

8. TG234Time.setFormat( 1);

9. TG234Time.print();

10. TG456Time.print();

11. }

12. }

13.

14. class Time {

15. static int format;

16. int hour, minute;

17. Time(int hour, int mm) { this.hour = hour; minute = mm; }

18. Time(int hour) { this(hour, 0); }

19. void setFormat ( int format) { Time.format =format; }

20. void print() {

21. if (format == 0)

22. System.out.println( hour + ":" + minute);

23. else {

24. if ( hour > 12)

25. System.out.println (hour-12 + ":" + minute + "PM");

26. else

27. System.out.println( hour + ":" + minute + "AM");

28. }

29. }

30. }

ตวอยางท ๔-๑๓ นอกจากจะแสดงการใชคาอางอง this แลว ยงมวตถประสงคใหเปนตวอยางของการใชตวแปรคลาสอกตวอยางหนงดวย คลาส Time มตวแปรคลาส ๑ ตวคอ format ใชเกบสมบตโดยรวมของออบเจกต ถาตวแปร format มคาเปนศนย หมายถงพมพเวลาโดยใชเลขชวโมงไดถง 24 ถาไมใชศนยหมายถงการบอกเวลาแบบ AM PM คาของตวแปร format เปลยนครงเดยวมผลตอทกออบเจกต เพราะทกออบเจกตใชตวแปรนรวมกน เรมแรกตวแปร format มคาเปนศนยโดยปรยาย แตตอมาถกเปลยนใหเปน 1 อนเปนผลมาจากการเรยกเมทอด setFormat ในบรรทดท ๘ บรรทดนเรยกเมทอด setFormat ของออบเจกต TG234Time ถาตามไปดการท างานในเมทอดแลวจะเหนวามการน าคาของพารามเตอรชอ format ซงรบคามาเปน 1 ไปใสไวในตวแปรคลาสทชอ format ซงเปนชอเดยวกน เพอไมใหก ากวมจงตองใสค าน าหนาชอของตวแปรคลาสดวยชอคลาส เปน Time.format ความจรงแลวในกรณนเราจะใสค าน าหนาชอ

Page 39: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

คลาส เมธอดและออบเจกต

39

ดวย this เปน this.format กได ซงหมายถงตวแปร format ของออบเจกตนทเมทอดก าลงด าเนนการอย แตเนองจาก ตวแปรสมาชก format ตวนเปนตวแปรคลาส ซงมเพยงตวเดยวเทานนไมไดอยในออบเจกตใด การเขยนเปน Time.format จงเปนการสรางความชดเจน วา format ตวนเปนตวแปรคลาส

ถงแมวาตวแปรคลาส format จะถกสงใหเปลยนคาโดยออบเจกต TG234Time กตาม แตผลของมนมกบทกออบเจกต เพราะทกออบเจกตใชตวแปรสมาชก format รวมกน ดงนน หลงจากเปลยนคาของตวแปร format แลว เราสงใหแตละออบเจกตพมพเวลาของมนออกมาอกครง คราวนจะพมพอกรปแบบทตางไปจากเดม เนองจากเมทอด print ม ๒ รปแบบใหเลอก ผลลพธจากการท างานของตวอยางโปรแกรมนเปนดงน 18:30

15:0

6:30PM

3:0PM

เมทอดคลาสและออบเจกต

เมทอดทประกาศโดยมค าส าคญ static ก ากบอยดวยถอวาเปนเมทอดคลาส(class method) เมทอดชนดนถอวาเปนเมทอดของคลาสไมขนไมเกยวของกบออบเจกตใด จะถกเรยกโดยไมตองอางถงออบเจกต การอางถงตวแปรอนสแทนซ (instance variable) จากภายในเมทอดประเภทนไมวาจะมคาอางอง this

ก ากบอยดวยหรอไมกตาม ถอวาไมถกตอง จะเกดขอผดพลาดขณะคอมไพล นนกคอเมทอดคลาสไมมสทธใชตวแปรอนสแทนซ มนสามารถใชไดเฉพาะตวแปรคลาสและตวแปรเฉพาะบรเวณ (local variable) เทานน

สวนเมทอดทประกาศโดยไมมค าส าคญ static ก ากบอยดวยถอวาเปนเมทอดของออบเจกตดงทกลาวไปกอนหนานแลว เมทอดประเภทนจะถกเรยกควบคกบตวแปรอางองทอางถงออบเจกตทเกยวของเสมอ ซงคาอางองทใชตอนเรยกเมทอดนจะถกน าไปใชเปนคาอางอง this ในเมทอดทถกเรยกใหก าลงท างาน

การสรางแพคเกจ

ถาเราตองการจดระเบยบของแพคเกจ ตอนทเราเขยนแพคเกจควรใสชอของแพคเกจไวในบรรทดแรก ๆ

ของแฟมโปรแกรมตนฉบบ กอนทจะถงการก าหนดคลาสใด ๆ ในแพคเกจ การตงชอแพคเกจเราจะใชค าส าคญ

package ชวยดงตวอยางตอไปน package somchai.util;

การเขยนขอความสงนหมายความวา ทกคลาสทเขยนไวในแฟมโปรแกรมตนฉบบเดยวกนนถกจดใหอยในแพคเกจ somchai.util ขอความสง package จะตองเปนขอความสงทมากอนขอความสงอนใดในแฟม สงทจะมากอนขอความสงนไดมเพยงหมายเหต (comment) เพยงอยางเดยวเทานน

เมอเราสรางแพคเกจ เราตองน าแฟมทไดจากการคอมไพล (แฟมทมสกลเปน class) ไปใสไวในสารบบยอยใหถกดวย ตวอยางเชนถาเราคอมไพลแฟมตนฉบบทระบชอแพคเกจไววา

Page 40: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

การสรางโปรแกรมเชงวตถดวยภาษาจาวา

วนชย ขนต ภาควชาระบบสารสนเทศเพอการจดการ คณะพาณชยศาสตรและการบญช มหาวทยาลยธรรมศาสตร 40

package somchai.util;

เราตองเอาผลลพธแฟมคลาสทไดไปไวทสารบบยอย somchai\util เอง คอมไพเลอรไมใสใหเรา

ถาในแฟมโปรแกรมตนฉบบไมมการประกาศชอแพคเกจ จาวาจะจดใหคลาสตาง ๆทเขยนไวในแฟมน อยในแพคเกจทเรยกวาแพคเกจโดยปรยาย (default package)

ขอบเขตของแพคเกจ

เราไดรจกตวดดแปรการเขาถงของตวแปรสมาชกมาบางแลวในเรองการปกปองขอมล ถาเราประกาศตวแปรสมาชกใหเปน private ตวแปรนจะเขาถงไดเฉพาะคลาสของมนเองเทานนคลาสอนไมสามารถใชตวแปรนได คลาสกมตวดดแปรการเขาถงท านองเดยวกบตวแปรสมาชก แตใชดวยวตถประสงคทตางกน กรณของตวแปรสมาชกเรามกปกปอง แตกรณของคลาสเรามกเปดเผย เพราะวาเราสรางคลาสขนมาไมใชเพอใหคลาสเดยวกนใชกนเอง เราสรางคลาสขนมาเพอใหคลาสอนใชเปนการทวไปเสยมากกวา ดงนนจาวาจงไมยอมใหใชตวดดแปรการเขาถงคลาสเปน private ตวอยางทผานมาในบทนไมไดระบตวดดแปรการเขาถงคลาสเลย ถาไมมการระบตวดดแปรการเขาถงในตอนก าหนดคลาส คลาสนนจะถกใชไดเฉพาะในแพคเกจของมนเทานน นนหมายความวาคลาสเมทอดอน ๆ ทอยในแพคเกจเดยวกนสามารถใชมนได แตคลาสเมทอดในแพคเกจอนไมสามารถใชมนได ถาเราตองการใหคลาสทเขยนขนสามารถใชจากคลาสใด ๆ กได ไมจ าเปนวาจะตองเปนคลาสในแพคเกจเดยวกน เราตองประกาศคลาสนนใหเปนคลาสสาธารณะ โดยระบตวดดแปรการเขาถงคลาสเปน public ในตอนก าหนดคลาส

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

กรณของตวแปรสมาชกถาก าหนดการเขาถงเปน private คลาสอนไมสามารถเขาถงมนได ถาไมระบตวดดแปรการเขาถงไวเลย ตวแปรสมาชกนนสามารถเขาถงไดจากทกคลาสของแพคเกจเดยวกน แพคเกจอนไมสามารถเขาถงได ถงแมคลาสของมนจะเปนสาธารณะกตาม ถาตองการใหตวแปรสมาชกสามารถเขาถงไดจากทกคลาสรวมทงคลาสตางแพคเกจดวย ตองระบตวดดแปรการเขาถงตวแปรเปน public

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

private ถาตองการใหคลาสใดกใชไดไมจ าเปนตองเปนแพคเกจเดยวกน ใหระบเปน public

ตวอยางท ๔-๑๔ เปนตวอยางของการสรางคลาส Time ของแพคเกจ somchai.util ตวอยางนพยายามก าหนดตวดดแปรใหกบคลาส เมทอดและตวแปรสมาชก

ตวอยางท ๔-๑๔ แสดงการสรางคลาส Time ไวในแพคเกจ somchai.util 1. package somchai.util;

2. public class Time {

Page 41: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

คลาส เมธอดและออบเจกต

41

3. private static int format;

4. private byte hour;

5. private byte minute;

6. Time(int h) {

7. setHour(h);

8. minute = 0;

9. };

10. Time(int h, int m) {

11. setHour(h);

12. setMinute(m);

13. }

14. public boolean setHour(int h) {

15. if ( h >=0 && h <= 24 ) {

16. hour = (byte)h;

17. return true;

18. } else

19. return false;

20. }

21. public boolean setMinute(int m) {

22. if ( m >=0 && m < 60 ) {

23. minute = (byte)m;

24. return true;

25. } else

26. return false;

27. }

28. public byte getHour() { return hour; }

29. public byte getMinute() { return minute; }

30. public void addHour(int dh) {

31. int h;

32. h = hour + dh;

33. if ( h >= 24 ) {

34. hour = (byte)(h % 24);

35. return;

36. }

37. hour = (byte)h;

38. }

39. public void addMinute(int dm) {

40. int m;

41. m = minute + dm;

42. if ( m >= 60 ) {

43. minute = (byte)(m % 60);

44. addHour( m / 60 );

45. } else

46. minute = (byte)m;

47. }

48. public void print() {

49. if (format == 0)

50. System.out.println( hour + ":" + minute);

51. else {

52. if ( hour > 12)

53. System.out.println (hour-12 + ":" + minute + "PM");

54. else

55. System.out.println( hour + ":" + minute + "AM");

56. }

57. }

58. }

Page 42: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

การสรางโปรแกรมเชงวตถดวยภาษาจาวา

วนชย ขนต ภาควชาระบบสารสนเทศเพอการจดการ คณะพาณชยศาสตรและการบญช มหาวทยาลยธรรมศาสตร 42

จะเหนวาก าหนดคลาส Time ใหเปน public เมทอดทกตวก าหนดใหเปน public เพอใหคลาสอนเรยกใชได สวนตวแปรสมาชกก าหนดใหเปน private เพอปองกนไมใหคลาสอนมาใชตวแปรโดยตรง ตองใชผานเมทอดเทานน

หมายเหต แฟมโปรแกรมตนฉบบสามารถบรรจคลาสสาธารณะไดเพยงคลาสเดยวเทานน และชอคลาสสาธารณะนนตองเปนชอเดยวกบชอแฟมตนฉบบดวย

คลงคลาส

เมอเรามคลาสสะสมมากเขา เรามกอยากจดระเบยบหรอจดหมวดหมของคลาสเหลานน วธการจดระบบทใชในภาษาจาวาคอการน าคลาสทสมพนธหรอเกยวกบเรองใดเรองหนงไปไวรวมกนในสารบบเดยวกนทเรยกวาแพคเกจ เราอาจสรางสารบบขนมาเพอใชเปนทเกบรวบรวมคลาส ชอสารบบจะใชเปนชอแพคเกจ ทรวมของแพคเกจตาง ๆ เรยกวาคลงคลาส (class library)

ค าแนะน าในการออกแบบคลาส

๑. พยายามใหขอมลเปนสวนตว

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

๒. ก าหนดคาเรมตนใหขอมลเสมอ

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

๓. ไมจ าเปนวาทกตวแปรสมาชกจะตองมตวเขาถงและตวเปลยน

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

๔. อยาใหคลาสใหญโตจนเกนไป

ถาคลาสมททาวาจะซบซอนเกนไป ควรแบงออกเปนหลายคลาสทงายและเลกลง แบงหนาทความรบผดชอบกนไป แตไมใชแบงออกเปนหลาย ๆ คลาส แตละคลาสมขนาดเลกจนแทบไมมอะไรจะท า ตวอยางเชน คลาส Customer ตองการเกบทอยของลกคาไวดวย ถาคลาสเรมใหญโตจนซบซอน เราอาจแบง

Page 43: คลาส เมท็อด และ อ็อบเจกต์ · คลาส เมธอดและอ๊อบเจกต์ 3 การสร้างอ็อบเจกต์

คลาส เมธอดและออบเจกต

43

ขอมลเกยวกบทอยแยกออกไปเปนอกคลาส เชนเปนคลาส Address แลวบรรจคลาส Address เปนขอมลสมาชกของคลาส Customer แทน

๕. ต งชอคลาสและเมทอดใหตรงกบหนาทและความรบผดชอบ

ตงชอใหสอความหมายและสะทอนสงทมนท า แนวทางทดคอตงชอคลาสดวยค านาม สวนเมทอดตงชอดวยค ากรยา การตงชอควรเปนไปตามขอนยมซงนกเขยนโปรแกรมสวนใหญใชกนคอนยมตงชอคลาสขนตนดวยอกษรโรมนตวใหญ สวนชอเมทอดนยมขนตนดวยอกษรโรมนตวเลก ถาเปนเมทอดตวเขาถงควรน าหนาชอเมทอดดวย get ถาเปนเมทอดตวเปลยนควรน าหนาชอเมทอดดวย set