บทที่ 8 Methods

Preview:

Citation preview

 

บทท่ี 8 เมธอด (Methods)

1.ความหมายของเมธอด โปรแกรมในภาษาจาวานัน้ประกอบด้วย

object จากหลายๆคลาส ซึ่งมปีฏิสมัพนัธซ์ึ่งกันและกัน object แต่ละอันจะประกอบไปด้วยสว่นของ attribute และเมธอด (method) ซึ่งเมธอดก็คือกลุ่มของคำาสัง่ท่ีถกูรวมเขา้ไว้ภายใต้ชื่อหน่ึงๆ สำาหรบัทำาหน้าท่ีตามท่ีผู้เขยีนโปรแกรมกำาหนด

2. การประกาศเมธอด การประกาศเมธอดแต่ละครัง้ จะต้องประกาศไวใ้น

คลาสใดคลาสหน่ึงเสมอ รูปแบบของการประกาศ เมธอดจะมลัีกษณะโดยทัว่ไปดังต่อไปน้ี

โดยท่ี modifier คือ คียเ์วริด์ท่ีกำาหนดคณุสมบติัการเขา้ถึงเมธอด return_type คือ ชนิดของขอ้มูลท่ีเมธอดจะสง่ค่ากลับ ถ้าในกรณีท่ีไมม่กีารสง่ค่าใดๆ กลับจะกำาหนดใหเ้ป็น void MethodName คือ ชื่อเมธอด parameter คือ พารามเิตอรท่ี์ใชใ้นการรบัขอ้มูล method_body คือ ชุดคำาสัง่การทำางานของเมธอด varValue คือ ค่าท่ีต้องการสง่ค่ากลับ ในกรณีท่ีกำาหนดให ้return_type เป็น void จะไมม่คีำาสัง่ return

3. อารกิ์วเมนต์ (Argument) และพารามเิตอร ์(Parameter)

ในการเรยีกใชเ้มธอดนัน้ เราสามารถสง่ผ่านขอ้มูลใหก้ับเมธอดเพื่อใหเ้มธอดนัน้สามารถนำาขอ้มูลไปใชป้ระมวลผลได้ ค่าของขอ้มูลท่ีสง่ใหก้ับเมธอด เรยีกวา่ อารก์ิวเมนต์ (argument) เชน่ ในการเรยีกใชค้ำาสัง่ System.out.println("Hello");

“Hello” เป็น argument ท่ีสง่ใหก้ับเมธอด println() ซึ่งเมื่อมกีารสง่ค่า argument ใหก้ับเมธอดแล้ว ท่ีตัวของเมธอดจะต้องมกีารสรา้งตัวแปรเพื่อใชร้บัค่า argument นัน้ ตัวแปรท่ีถกูสรา้งขึ้นมานี้มชีื่อเรยีกวา่ พารามเิตอร ์(parameter)

จากตัวอยา่งท่ี 1 newDay, newMonth และ newYear คือ parameter ของเมธอด setDate ในการเรยีกใชง้านเมธอดนัน้ จำานวน argument ท่ีจะสง่ให้กับเมธอดจะต้องมจีำานวนตรงกับจำานวน parameter ท่ีจะมารบัเสมอ

จากตัวอยา่งที่ 2 ค่า 18, 10 และ 2556 คือ argument ท่ีสง่ใหกั้บเมธอด setDate โดยค่าเหล่านี้จะถกูสง่ไปเก็บไวท้ี่ parameter ท่ีชื่อวา่ newDay, newMonth และ newYear ตามลำาดับ

4. การเรยีกใชง้านเมธอด การเรยีกใชง้านเมธอดจะมสีว่นหลักๆ อยู ่2 สว่น คือ การ

สง่ค่า arguments ใหกั้บเมธอด และการรบัค่าท่ีสง่คืนมาจากเมธอด 4.1 การสง่ค่า argument ให้กับเมธอด

ในการจะสง่ค่า argument ใหกั้บเมธอด เราจะต้องประกาศ parameter สำาหรบัเมธอดนัน้ๆ โดยจะต้องระบุชนิดขอ้มูล ตามด้วยชื่อของ parameter ถ้าหากต้องการใหม้ ีparameter มากกวา่หนึ่งตัว สามารถทำาได้โดยใชเ้ครื่องหมาย , (comma) คัน่ในตอนท่ีเราสรา้งเมธอด ดไูด้จากตัวอยา่งท่ี 1

การเรยีกใชเ้มธอด หากเมธอดนัน้มกีารรบัค่าด้วย parameter เราต้องทำาการสง่ argument ใหกั้บเมธอดนัน้ โดยท่ีจำานวน argument นัน้ต้องเท่ากับจำานวน parameter ท่ีเราประกาศไว ้โดยคัน่ระหวา่ง argument แต่ละตัวด้วยเครื่องหมาย comma และชนิดขอ้มูลของ argument นัน้ต้องตรงกับชนิดขอ้มูลของ parameter ด้วย ดไูด้จากตัวอยา่งท่ี 2

ค่าของ argument ท่ีจะสง่นัน้ อาจจะเป็นค่าคงท่ี(constant) เชน่ 10 (int constant), -1.2 (double constant), ‘a’ (char constant), true (boolean constant) หรอืตัวแปร (variable) เชน่ x, myDog, std1.name หรอืนิพจน์ (expression) เชน่ x*x / 2 - 1.732, date.getDay() ก็ได้ แต่ชนิดขอ้มูลนัน้จะต้องสอดคล้องกับชนิดขอ้มูลของ parameter

การสง่ค่าใหกั้บเมธอดในภาษาจาวานัน้ เป็นการสง่ค่าแบบ pass by value หมายความวา่ เมื่อมกีารเรยีกใชง้านเมธอด โปรแกรมจะทำาการสรา้งตัวแปรขึ้นมาใหมใ่นเมธอดท่ีถกูเรยีก เพื่อมารบัค่าท่ีจะถกูสง่เขา้มา การแก้ไขค่าของ parameter ในเมธอดจงึไมส่ง่ผลกระทบกับตัวแปรต้นฉบบัหากตัวแปรนัน้เป็นขอ้มูลชนิดพื้นฐาน (primitive type)

จากตัวอยา่งท่ี 3 สาเหตท่ีุ x ยงัคงมค่ีาเท่ากับ 10 ภายหลังจากการเรยีกใชง้านเมธอด add5 เนื่องจากวา่ตัวแปร x ท่ีอยูใ่น main กับตัวแปร x ท่ีอยูใ่นเมธอด add5 เป็นคนละตัวกัน ดังนัน้ คำาสัง่ x = x + 5 จงึสง่ผลกับแปร x ท่ีอยูใ่นเมธอด add5 เท่านัน้ และเมื่อเรากลับมาท่ี main ค่าของ x ใน main จงึมค่ีาเท่าเดิม

อยา่งไรก็ตาม หาก object ท่ีสง่ใหก้ับเมธอดมชีนิดขอ้มูลเป็นแบบอ้างอิง (reference type) การเปล่ียนค่า attribute ของ object นัน้ๆในเมธอด จะสง่ผลกระทบกับ object ต้นฉบบัด้วย ดังตัวอยา่งต่อไปน้ี

จากตัวอยา่งท่ี 4 สาเหตท่ีุ num มค่ีาเปล่ียนไปหลังจากเรยีกใชง้านเมธอดก็เพราะวา่ตัวแปรชนิด object ทกุๆตัวนัน้เป็นประเภท reference type เสมอ ซึ่งสิง่ท่ีเก็บอยูใ่นตัวแปร reference type คือตำาแหน่งท่ีอยู(่adddress)ในหน่วยความจำาท่ี object นัน้ๆ ถกูเก็บอยูใ่นตอนท่ีมนัถกูสรา้งขึ้นมาด้วยคำาสัง่ new ดังนัน้ในตอนท่ีเราเรยีกใชเ้มธอด add10(obj) นัน้ ค่าท่ีถกูสง่ใหก้ับเมธอดคือตำาแหน่งท่ีอยูข่องตัว object เมื่อเราทำาการเปล่ียนค่าของ object ในตัวเมธอด ค่านัน้จะถกูเปล่ียนท่ีตัว object ตามตำาแหน่งท่ีอยูท่ี่มนัถกูเก็บไว ้ตัว object ต้นฉบบัจงึถกูเปล่ียนค่าไปด้วย

4.2 การรบัค่าคืนจากเมธอด หากเมธอดมกีารสง่ค่าคืน (ม ีreturn type ท่ีไมใ่ช ่void)

เราจะต้องสัง่ใหเ้มธอดทำาการสง่ค่ากลับ ซึ่งทำาได้โดยใชค้ำาสัง่ return value; โดยวางคำาสัง่นี้ไวท่ี้ตัวเมธอด ทัง้น้ี value คือค่าท่ีเราต้องการสง่กลับ ดังตัวอยา่งต่อไปนี้

จากตัวอยา่งท่ี 5 ค่าท่ีสง่กลับมาจากเมธอดนัน้ เราสามารถท่ีจะนำาไปเก็บไวใ้นตัวแปรก่อน (โดยท่ีชนิดขอ้มูลจะต้องตรงกับชนิดขอ้มูลท่ีเมธอด return มาให)้ หรอืวา่เราสามารถท่ีจะนำาไปใชเ้ลยโดยตรงก็ได้ ดังเชน่บรรทัดท่ี 7 และ 9 ตามลำาดับ

5. ประเภทของเมธอด เมธอดในภาษาจาวา สามารถแบง่ออกได้เป็น 3 ประเภทหลักๆตามหน้าท่ีการใชง้าน ดังนี้ 1) Instance method 2) Static method 3) Constructor method  

5.1 Instance Method Instance method คือเมธอดท่ีกระทำากับตัว

object โดยตรง ดังเชน่ในตัวอยา่งท่ี 1 setDate ถือเป็น instance method เพราะวา่ setDate จะกระทำากับ object ท่ีเรยีกใชม้นัเท่านัน้ จากตัวอยา่งท่ี 2 จะเหน็ได้วา่ การจะเรยีกใชง้านเมธอด setDate นัน้ เราจะต้องทำาการสรา้ง object (ในท่ีน้ีคือ date) ขึ้นมาก่อน แล้วเรยีกใช้ผ่าน object นัน้ (บรรทัดท่ี 3 และ 4) เราสามารถใชคี้ยเ์วริด์ this เพื่อเรยีกถึง object ท่ีทำาการเรยีกใชเ้มธอดนัน้ๆได้ ตัวอยา่งเชน่

เราสามารถใชคี้ยเ์วริด์ this เพื่อเรยีกถึง object ท่ีทำาการเรยีกใชเ้มธอดนัน้ๆได้ ตัวอยา่งเชน่

จากตัวอยา่งท่ี 6 ในเมธอด setDate ม ีparameter 3 ตัว ได้แก่ day, month และ year ซึ่งจะเหน็วา่หากเราเขยีนวา่ day = day; อาจจะทำาให้โปรแกรมทำางานผิดพลาดได้ เพราะวา่ day ทัง้สองตัวนัน้อ้างถึงตัวแปรเดียวกันท่ีเป็น parameter ของเมธอด การท่ีเราจะอ้างอิงถึง day ท่ีเป็น instance variable นัน้ ทำาได้โดยใช ้this.day แทน ซึ่ง this จะมค่ีาเท่ากับตัว object ท่ีเรยีกใช ้อยา่งไรก็ตาม ไมแ่นะนำาใหตั้ง้ชื่อ parameter ใหเ้หมอืนกับชื่อ instance variable เพราะอาจจะทำาใหส้บัสนได้ ดังนัน้ ควรจะตัง้ชื่อ parameter ใหต่้างจากชื่อ attribute ดังเชน่ตัวอยา่งท่ี 1

5.2 Static Method Static method (หรอืเรยีกอีกชื่อหน่ึงวา่ class

method) คือเมธอดท่ีมพีฤติกรรมท่ีไมข่ึ้นอยูก่ับ object ใดๆ ตัวอยา่งเชน่ เมธอด abs สำาหรบัหาค่าสมับูรณ์นัน้ ควรจะมีพฤติกรรมท่ีไมข่ึ้นอยูก่ับ object ท่ีจะทำาการเรยีกใช ้แต่ขึ้นอยูก่ับ argument ของเมธอดเท่านัน้ นอกจากนี้ ผู้ใชค้วรจะสามารถเรยีกใช้เมธอด abs ได้โดยไมต้่องทำาการสรา้ง object ขึ้นมาใหม ่วธิกีารทำาเชน่น้ีในภาษาจาวาทำาได้โดยใสคี่ยเ์วริด์ static ไวห้น้าชื่อของเมธอด (แต่อยูห่ลังจาก access modifier) ดังตัวอยา่งต่อไปนี้

การเรยีกใชง้าน static method นัน้ เราสามารถเรยีกใชง้านผ่านชื่อคลาสได้โดยตรงโดยไมต้่องมกีารสรา้ง object ขึ้นมาก่อน ดังตัวอยา่งท่ี 8

ขอ้ควรระวงัสำาหรบัการใชง้าน static method ก็คือ เราไมส่ามารถเรยีกใชง้าน instance variable หรอื instance method จากภายใน static method ได้ แต่ยงัเราสามารถเรยีกใชง้าน static variable หรอื static method อ่ืนๆได้อยู ่

5.3 Constructor Method Constructor method เป็นเมธอดท่ีมลัีกษณะ

พเิศษ คือมชีื่อเหมอืนกับชื่อคลาสและไมม่กีารกำาหนดชนิดของขอ้มูลท่ีถกูสง่กลับ(return type) โดย constructor จะถกูเรยีกใชเ้มื่อมกีารใชค้ำาสัง่ new ดังเชน่บรรทัดท่ี 3 ของตัวอยา่งท่ี 2 ทัง้นี้หน้าท่ีของ constructor คือกำาหนดค่าเริม่ต้นใหกั้บ attribute ของ object ท่ีถกูสรา้งขึ้นมา การประกาศ constructor สามารถทำาได้เหมอืนกับเมธอดอ่ืนๆ ตัวอยา่งเชน่ 

ตัวอยา่งท่ี 9 คลาส Date ประกอบด้วย constructor สองตัว คือบรรทัดท่ี 4 – 8 ซึ่งเป็น constructor ท่ีไมม่กีารรบัค่า parameter และบรรทัดท่ี 10 – 14 ซึ่งมกีารรบัค่า parameter เป็น int 3 ตัว (การท่ีเรามเีมธอดท่ีมชีื่อเหมอืนกันมากกวา่หนึ่งเมธอด จะเรยีกวา่ method overloading ซึ่งรายละเอียดจะกล่าวในหวัขอ้ที่ 6) หากเราสรา้งคลาสโดยไมส่รา้ง constructor ขึ้นมาเอง (ดังเชน่ตัวอยา่งท่ี 1) จาวาจะทำาการสรา้ง default constructor ท่ีไมม่กีารรบัค่า parameter แล้วกำาหนดค่า instance variable ใหเ้ป็นค่าตาม default value ใหโ้ดยอัตโนมติั อยา่งไรก็ตาม หากเราสรา้ง constructor ขึ้นมาเองอยา่งน้อยหนึ่งตัว จาวาจะไมส่รา้ง default construct ใหก้ับเรา และถ้าเราต้องการใช ้constructor ท่ีไมร่บัค่า argument เราจะต้องสรา้งขึ้นมาเอง ตัวอยา่งเชน่

6. Method Overloading Method overloading คือการท่ีเมธอดมากกวา่หน่ึง

ตัวท่ีอยูภ่ายในคลาสเดียวกันมชีื่อเหมอืนกัน (เชน่ จากตัวอยา่งท่ี 9 ม ีconstructor ท่ีชื่อวา่ Date เหมอืนกันสองตัว)

Method overloading สามารถทำาได้ถ้าหากวา่มีอยา่งน้อยหน่ึงขอ้ต่อไปน้ีเป็นจรงิ (1) จำานวน parameter ของเมธอดท่ีจะ overload นัน้ไม่เท่ากัน (2) ชนิดขอ้มูลของ parameter นัน้ต่างกันอยา่งน้อยหนึ่งตัว

จากตัวอยา่งท่ี 11 จะสงัเกตเหน็วา่ คลาส Date ในท่ีนี้มเีมธอด add ทัง้หมด 3 เมธอด ซึ่งเมธอดทัง้หมดผ่านเง่ือนไขในขอ้ (1) หรอื (2)

ขอ้ควรระวงั: เราไมส่ามารถ overload เมธอดโดยใช ้return type ได้ ตัวอยา่งเชน่

ซึ่งจะใหผ้ลลัพธ ์error

7. ตัวอยา่งเมธอดสำาเรจ็รูปในภาษาจาวา ภาษาจาวานัน้ ได้สรา้งเมธอดสำาเรจ็รูปบางสว่นมาให้

แล้ว โดยท่ีเราสามารถเรยีกใชง้านได้เลย ตัวอยา่งเชน่ เมธอดท่ีเก่ียวกับการประมวลผลเกี่ยวกับตัวเลข จะอยูใ่นคลาส Math หรอื เมธอดท่ีเก่ียวกับการจดัการกับ string จะอยูใ่นคลาส String ตัวอยา่งของเมธอดสำาเรจ็รูปท่ีน่าสนใจมดีังนี้

เมธอดเหล่าน้ีเป็น static method เราจงึสามารถเรยีกใชง้านเมธอดเหล่าน้ีได้โดยคำาสัง่ Math.method_name(parameters)

เมธอดเหล่าน้ีเป็น instance method เวลาจะเรยีกใช ้เราต้องเรยีกใชผ้่าน object ตัวอยา่งเชน่ "abc".length(); หรอื String s = "This is a sample string"; boolean flag = s.contains("sample"); หมายเหต:ุ เมธอด concat, toLowerCase, toUppercase จะไมท่ำาการเปล่ียนค่าของตัว string ท่ีเรยีกใชโ้ดยตรง แต่จะ return ค่าของ string อันใหมท่ี่เป็นผลลัพธข์องเมธอดแทน ดังนัน้ หากเราต้องการเปล่ียนค่าของตัวแปรต้นฉบบัโดยเมธอด concat, toLowerCase, toUppercase, etc. เราจะต้องมกีารกำาหนดค่าใหก้ับมนัเอง เชน่ s = s.concat("abc"); s = s.toLowerCase(); s = s.toUpperCase(); 

จดัทำาโดย นางสาวกาญจนา ถึกจรูญ เลขท่ี21 นางสาวขวญัจริา โพธิล้์อม เลขท่ี28

นางสาวจดิาภา บำารุงวงศ์ เลขท่ี 29 นางสาวณัฐฐา ศรอิีนทร์ เลขท่ี 30

นางสาวพมิพล์ภัส กลมทกุสิง่ เลขท่ี 31 นางสาวสริลัิกษณ์ วุฒมิงคลกลุ เลขท่ี32

นางสาวเกสรา วจันะ เลขท่ี 38

ชัน้ มธัยมศึกษาปีท่ี 6/2 เสนอ

คณุครู ทรงศักด์ิ โพธิเ์อ่ียม

Recommended