240 likes | 420 Views
บทที่ 4 การเขียนคลาส. การประกาศคลาส , การประกาศเมธอด ตัวแปรอ้างอิง , การห่อหุ้ม การโอเวอร์โหลดเมธอด และอ๊อบเจ็คทางด้านกราฟฟิก. ออบเจ็ค. อ๊อบเจ็คหนึ่ง ประกอบด้วย สถานะ ใช้อธิบายคุณสมบัติของออบเจ็ค พฤติกรรม แสดงถึงสิ่งที่ออบเจ็คสามารถทำได้
E N D
บทที่ 4 การเขียนคลาส การประกาศคลาส, การประกาศเมธอด ตัวแปรอ้างอิง, การห่อหุ้ม การโอเวอร์โหลดเมธอด และอ๊อบเจ็คทางด้านกราฟฟิก
ออบเจ็ค • อ๊อบเจ็คหนึ่ง ประกอบด้วย • สถานะ ใช้อธิบายคุณสมบัติของออบเจ็ค • พฤติกรรม แสดงถึงสิ่งที่ออบเจ็คสามารถทำได้ • ตัวอย่างเช่น เหรียญที่สามารถพลิกไปพลิกมาได้ โดยเหรียญสามารถแสดงหน้าหัว หรือหน้าก้อย • สถานะของเหรียญ คือ หน้าที่ออก • พฤติกรรมของเหรียญ คือ การพลิกไปมาได้ • ข้อสังเกตุ: พฤติกรรมของเหรียญอาจมีผลต่อสถานะของมันเอง การเขียนคลาส
คลาส • คลาส คือแผ่นพิมพ์เขียวของออบเจ็ค • เช่น คลาส Stringใช้ในการกำหนดความเป็นออบเจ็ค String • Stringแต่ละอัน บรรจุตัวอักษรจำนวนหนึ่ง -> สถานะ • Stringแต่ละอัน สามารถจะให้บริการ หรือมีพฤติกรรม เช่น length() • คลาส Stringมีให้เรียกใช้จากไลบรารีมารตฐานของจาวา • เราสามารถเขียนคลาสขึ้นมาเองได้ • เช่น การเขียนคลาสเพื่อจำลองการพลิกไปมาของเหรียญ • เราจะให้ชื่อคลาสว่า Coin การเขียนคลาส
int x, y; char ch; คลาส • คลาส ประกอบด้วย ส่วนการประกาศตัวแปรเก็บข้อมูล และการประกาศเมธอด การประกาศตัวแปรเก็บข้อมูล การประกาศเมธอด การเขียนคลาส
ขอบเขตของตัวแปร • ขอบเขตของตัวแปร คือ พื้นที่ภายในโปรแกรมหนึ่งๆ ที่สามารถใช้งาน (อ้างอิง) ถึงตัวแปรได้ • ตัวแปรที่ถูกประกาศขึ้นภายในคลาส จะถูกใช้ได้ในทุกๆ เมธอดของคลาสนั้น • ตัวแปรที่ถูกประกาศขึ้นภายในเมธอด จะถูกใช้ได้ภายในเมธอดนั้นเท่านั้น โดยให้เรียกว่า ตัวแปรท้องถิ่น (Local Variables) การเขียนคลาส
การเขียนเมธอด • การประกาศเมธอด เป็นการกำหนดโค้ดที่จะทำงานเมื่อเมธอดนั้นถูกเรียกใช้ • เมื่อเมธอดหนึ่งถูกเรียกใช้ การไหลของโปรแกรมจะกระโดดมาที่เมธอดและทำงานตามโค้ดที่ระบุในเมธอด • เมื่อการทำงานของเมธอดสมบูรณ์ การไหลของโปรแกรมจะกลับไปยังจุดเดิมก่อนการกระโดด และทำงานต่อไป • การเรียกใช้เมธอด อาจจะให้ผลลัพธ์หรือไม่ก็ได้ ขึ้นอยู่กับการนิยามเมธอดนั้นๆ การเขียนคลาส
compute myMethod myMethod(); การไหลของเมธอด • การเรียกใช้เมธอดอาจจะเกิดขึ้นภายในคลาสเดียวกัน ซึ่งในกรณีนี้เราจะใช้ชื่ออย่างเดียวในการเรียกใช้ (ไม่ต้องมีการใช้ .) การเขียนคลาส
main doIt helpMe obj.doIt(); helpMe(); การไหลของเมธอด • การเรียกใช้เมธอดที่อยู่ต่างคลาสจะต้องมีการเรียกใช้ผ่าน . โดยหน้าจุด • เป็นตัวแปรอ้างอิง เมื่อเมธอดนั้นเป็นเมธอดของออบเจ็ค • เป็นชื่อคลาส เมื่อเมธอดนั้นเป็นเมธอดของคลาส การเขียนคลาส
คลาส Coin • ในคลาสCoinจะมีการใช้ตัวแปรข้อมูลดังต่อไปนี้ • faceเป็นตัวเลขจำนวนเต็มที่เก็บหน้าที่ออกของเหรียญในปัจจุบัน • HEADSและ TAILSเป็นค่าคงที่จำนวนเต็มที่เก็บความเป็นไปของสถานะเหรียญ • จะมีกำหนดเมธอดดังต่อไปนี้ • เมธอด Coin(คอนสตรัคเตอร์) ทำหน้าที่ในการกำหนดค่าเริ่มต้นให้กับออบเจ็ค • เมธอด flip จำลองการพลิกเหรียญ • เมธอด getFaceให้ผลลัพธ์เป็นหน้าปัจจุบันของเหรียญ • เมธอด toStringเพื่อให้ผลลัพธ์เป็นข้อความอธิบายเหรียญ การเขียนคลาส
คลาส Coin • เมื่อคลาส Coinถูกนิยามขึ้นมาแล้ว เราสามารถใช้งานมันได้จากหลายๆ คลาส หรือหลายๆ โปรแกรม • โปรแกรมหนึ่งๆ ไม่จำเป็นต้องใช้บริการทั้งหมดของคลาส Coinเมื่อมีการสร้างออบเจ็คจากคลาส Coin • เมธอดทุกของเมธอดของคลาสCoinเป็นเมธอดของ Object ซึ่งต้องเรียกผ่าน ตัวแปรอ้างอิง CountFlips.java และ Coin.java การเขียนคลาส
class Coin coin1 coin2 int face; face face 0 1 ตัวแปรของออบเจ็ค • ตัวแปร faceถือเป็นตัวแปรของออบเจ็ค ซึ่งแต่ละออบเจ็คที่สร้างจากคลาส Coinมีเป็นของตนเอง • การประกาศคลาส ไม่มีการสร้างออบเจ็ค ตัวแปรของออบเจ็คจะเกิดขึ้นจริง เมื่อออบเจ็คถูกสร้างขึ้นเท่านั้น • ทุกครั้งที่ออบเจ็คจากคลาส Coin ถูกสร้างขึ้น ตัวแปร faceตัวใหม่จะถูกสร้างขึ้นเช่นเดียวกัน • ออบเจ็คที่สร้างจากคลาสเดียวกัน มีการนิยามเมธอดร่วมกัน แต่มีเนื้อที่แยกกันสำหรับการเก็บข้อมูล FlipRace.java การเขียนคลาส
การห่อหุ้ม (Encapsulation) • เราสามารถมองออบเจ็คได้จากสองมุมมอง • มองจากภายใน เราจะเห็นตัวแปร (ข้อมูล) และคำสั่งต่างๆ ภายในเมธอด • มองจากภายนอก เราจะเห็นการทำงานร่วมกันระห่างออบเจ็คที่เราสนใจกับออบเจ็คอื่นๆ ในโปรแกรม • เมื่อมองจากภายนอก ออบเจ็คจะต้องซ่อนรายละเอียด (กล่าวไว้ในบทที่ 2) • เราจะมองเห็นเพียงรูปแบบการติดต่อกับออบเจ็คเท่านั้น (interface) • ออบเจ็คจะต้องดูแลตนเอง • การเปลี่ยนสถานะของออบเจ็คควรทำโดยเมธอดของออบเจ็คเอง การเขียนคลาส
การห่อหุ้ม (Encapsulation) • ออบเจ็คที่มีการห่อหุ้ม อาจถูกมอง เป็น กล่องดำ • การทำงานภายในจะถูกซ่อนจาก ผู้ขอใช้บริการ ซึ่งจะเรียกว่าเมธอดที่ออบเจ็คได้จัดเตรียมไว้ให้ (interface methods) เมธอด ผู้ขอใช้บริการ ข้อมูล การเขียนคลาส
ตัวปรับปรุงการมองเห็นตัวปรับปรุงการมองเห็น • เพื่อให้การออกแบบออบเจ็คเป็นไปตามหลักของการห่อหุ้ม เราจำเป็นต้องใช้ ตัวปรับปรุงการมองเห็น อย่างเหมาะสม • ตัวปรับปรุง (modifier) ทุกตัวเป็นคำสงวน • finalเป็นตัวปรับปรุงที่ทำให้ตัวแปรเป็นค่าคงที่ • ตัวปรับปรุงการมองเห็น มี 3 ตัว คือ public, privateและ protected • protectedจะมีการพูดถึงในบทถัดไป • สมาชิกของคลาส (ตัวแปรและเมธอด) ที่ใช้ตัวปรับปรุงการมองเห็น • เป็น publicจะสามารถเข้าถึงได้จากทุกแห่ง • เป็น privateจะสามารถเข้าถึงได้จากภายในคลาสเท่านั้น • ไม่ระบุ จะสามารถเข้าถึงได้จากคลาสที่อยู่ในแพกเกจเดียวกันเท่านั้น การเขียนคลาส
หลักการเลือกตัวปรับปรุงการมองเห็นหลักการเลือกตัวปรับปรุงการมองเห็น • เลือก publicสำหรับ • เมธอดที่ถูกเรียกใช้จากภายนอก • เลือก privateสำหรับ • ตัวแปรทุกตัวของออบเจ็ค • เมธอดที่สร้างขึ้นเพื่อช่วยในการทำงานของเมธอดที่ถูกเรียกใช้จากภายนอก แต่เมธอดนี้เองไม่ควรถูกเรียกจากภายนอก การเขียนคลาส
การประกาศเมธอด • การประกาศเมธอดจะเริ่มต้นด้วยหัวของเมธอด char calc (int num1, int num2, String message) รายการของพารามิเตอร์ กำหนด ... ชนิดและชื่อของพารามิเตอร์แต่ละตัว ชื่อของเมธอด ชนิดของผลลัพธ์ เมื่อเรียกใช้เมธอด การเขียนคลาส
การประกาศเมธอด • หัวของเมธอดจะตามด้วยตัวของเมธอด char calc (int num1, int num2, String message) { int sum = num1 + num2; char result = message.charAt (sum); return result; } sumและresult เป็นตัวแปรท้องถิ่นซึ่งจะถูกสร้างขึ้นทุกครั้ง เมื่อมีการเรียกใช้เมธอด และถูกทำลายทุกครั้ง เมื่อการทำงานของเมธอดเสร็จสิ้น (รวมไปถึงnum1, num2และ message) คำสั่ง returnจะต้องตามด้วยนิพจน์ ที่มีชนิดสอดคล้องกับที่ระบุไว้ในหัวของเมธอด การเขียนคลาส
คำสั่ง return • ชนิดผลลัพธ์ของเมธอด จะถูกกำหนดไว้ในหัวของเมธอด • หากเมธอดใดไม่มีการคืนผลลัพธ์ ให้กำหนดชนิดเป็น void • การเรียกใช้เมธอดประเภทนี้จะไม่สามารถนำไปใช้ร่วมกับตัวดำเนินการใดๆ หรือเป็นพารามิเตอร์ของเมธอดอื่นได้ • คำสั่ง returnจะตามด้วยนิพจน์ที่มีชนิดตรงกันกับที่กำหนดไว้ในหัวของเมธอด • หากเมธอดไม่มีการคืนผลลัพธ์ คำสั่งreturnจะไม่มีนิพจน์ตามหลัง • เมื่อการไหลของโปรแกรมมาถึงคำสั่ง returnจะถือว่าเป็นการจบการทำงานของเมธอดทันที (แม้ว่าจะทำงานไปไม่ถึงบรรทัดสุดท้าย) การเขียนคลาส
char calc (int num1, int num2, String message) { int sum = num1 + num2; char result = message.charAt (sum); return result; } พารามิเตอร์ • การเรียกใช้เมธอดที่ถูกประกาศขึ้น จะต้องมีการส่งผ่านพารามิเตอร์ซึ่งเป็นนิพจน์ชนิดเดียวกับที่กำหนดไว้ในหัวของเมธอด • ค่าของพารามิเตอร์จะถูกสำเนาไปยังตัวแปรท้องถิ่นที่กำหนดไว้ในหัวของเมธอด ch = obj.calc (25, count, "Hello"); การเขียนคลาส
คอนสตรัคเตอร์ • คอนสตรัคเตอร์ เป็นเมธอดพิเศษที่ใช้ร่วมกับ newในการสร้างออบเจ็ค • เมื่อประกาศคอนสตรัคเตอร์ จะมีข้อกำหนดดังต่อไปนี้ • ชื่อจะต้องเหมือนกับชื่อของคลาส • จะไม่มีการคืนผลลัพธ์กลับ • ไม่ต้องระบุชนิดของการคืนผลลัพธ์ ไม่ต้องใส่แม้กระทั่ง void • บ่อยครั้ง คอนสตรัคเตอร์ จะทำหน้าที่เพียงกำหนดค่าให้กับตัวแปรของออบเจ็ค • โดยทั่วไป นักพัฒนา ไม่จำเป็นต้องประกาศคอนสตรัคเตอร์สำหรับคลาส การเขียนคลาส
การเขียนคลาส • ออบเจ็คอาจจะมีตัวแปรอ้างอิงไปยังอีกออบเจ็คอื่น • เช่นออบเจ็คชนิด Accountมีตัวแปรอ้างอิงชนิด String • ออบเจ็คอาจจะสัมพันธ์กับอีกออบเจ็คหนึ่งซึ่งเป็นประเภทเดียกัน เช่น r3 = r1.add(r2); • เมธอด addของ r1ถูกเรียกใช้ โดยให้ r2เป็นพารามิเตอร์ และเก็บผลลัพธ์การทำงานไว้ใน r3 • เช่น การรวมกันของสอง Account (เรียกใช้เมธอด merge) Account.java และ Banking.java การเขียนคลาส
การโอเวอร์โหลดเมธอด • คือการที่คลาสหนึ่งมีการประกาศเมธอดที่มีชื่อเหมือนกันหลายเมธอด แต่จะต้องมีลายเซ็นต์ที่แตกต่างกัน • ลายเซ็นต์ของเมธอดจะประกอบด้วย • ชื่อ • พารามิเตอร์ (จำนวน ชนิด และลำดับ) • ชนิดผลลัพธ์ของเมธอดไม่เป็นส่วนหนึ่งของลายเซ็นต์ • ต.ย. เมธอดที่ถูกโอเวอร์โหลด คือเมธอด System.out.println System.out.println ("The total is:"); System.out.println (total); การเขียนคลาส
Version 1 Version 2 float tryMe (int x, float y) { return x*y; } float tryMe (int x) { return x + .375; } การเรียกใช้ result = tryMe (25, 4.32) การโอเวอร์โหลดเมธอด • เมื่อมีการเรียกใช้เมธอดของที่ถูกโอเวอร์โหลด เมธอดที่มีลายเซ็นต์ตรงกันกับการเรียกใช้จะถูกเลือกมาทำงาน การเขียนคลาส
ออบเจ็คกราฟฟิก • เราสามารถประกาศเมธอดอื่นๆ ในแอพเพล็ตเพื่อช่วยในการทำงาน • ควรเลือกใช้ตัวปรับปรุงการมองเห็นแบบ private • ตัวแปรอ้างอิงชนิด Graphicsที่ส่งมากับเมธอด paintสามารถส่งผ่านไปยังเมธอดอื่น หรือคลาสอื่นเพื่อทำงานได้ Lineup.java และ StickFigure.java การเขียนคลาส