ต่อไปนี้จะเป็นการพูดถึงในส่วนที่เหลือที่เกี่ยวข้องกับฟังก์ชัน ได้แก่ การเรียกใช้ฟังก์ชันทั้งจากภายในคลาสเดียวกันและจากต่างคลาสกัน อีกเรื่องได้ฟังก์ชันเรียกซ้ำ(recursive function)
Pass-by-value และ Pass-by-reference
เนื่องจากการเรียกใช้ฟังก์ชันจะมีวิธีการที่ต้องเรียกเมท็อดแบบสร้าง reference ดังนั้นจะขออธิบายเรื่อง pass-by-value และ pass-by-reference ก่อน
Pass-by-value เป็นเรื่องของการส่งค่าระหว่างตัวแปรของประเภทข้อมูลชนิดต่างๆ ซึ่งจริงๆก็เป็นการส่งค่าตัวแปรแบบธรรมดาอย่างที่ได้ทำกันมาแล้ว เช่น a = 1; b = 6; a = b; ผลลัพธ์ a =6; เป็นต้น เพราะฉะนั้นเครื่องหมาย = จึงมีความหมายว่าเอาค่าทางขวาไปใส่ทางซ้าย
ส่วน pass-by-reference มีความพิเศษกว่าแบบบนตรงที่เป็นเรื่องเกี่ยวกับอ็อปเจ็คด้วย เป็นเรื่องเกี่ยวกับการชี้[1](ด้วยเครื่องหมาย = ) กล่าวคือ เครื่องหมาย = จะมีความหมายว่าค่าทางซ้ายและค่าทางขวาชี้ไปที่อ็อปเจ็คเดียวกัน ค่าก็จะเหมือนกันด้วย
ตัวอย่างของ pass-by-reference
รูป 6-1
บรรทัดที่ 11 : สร้างตัวแปร x1 เป็นอ็อปเจ็คของคลาส StudyReference โดยกำหนดตัวแปรใน () เป็น 1
บรรทัดที่ 12 : สร้างตัวแปร x2 เป็นอ็อปเจ็คของคลาส StudyReference โดยกำหนดตัวแปร เป็น null หรือว่าง
เปล่า ถ้าสั่งแสดงผลของ x2 เลยันที จะเกิด java.lang.NullPointerException
บรรทัดที่ 14 : สั่งแสดงผลค่าของ x1
บรรทัดที่ 16 : ให้ x2 ชี้ไปยังอ็อปเจ็คที่ x1 ชี้อยู่
บรรทัดที่ 17 : ให้ x1 ชี้ไปยังอ็อปเจ็คใหม่คือเลข 25
บรรทัดที่ 19 : ให้แสดงค่าของ x1 ที่ชี้ไปที่อ็อปเจ็คใหม่ออกมา
บรรทัดที่ 20 : เนื่องจาก x2 ชี้ไปสิ่งเดียวกันกับที่ x1 ชี้อยู่ ดังนั้นเมื่อ x1 ชี้ไปสิ่งใหม่ x2 ก็จะต้องเปลี่ยนสิ่งที่ชี้ไป
ตาม x1 ด้วย ดังนั้น x2 จะต้องได้แสดงค่า 25
ผลลัพธ์ที่ได้
รูป 6-2
การเรียกใช้เมท็อด
การเรียกใช้งานฟังก์ชัน จะต้องทำการพิมพ์ชื่อฟังก์ชันและใส่พารามิเตอร์ที่ถูกต้องกันกับฟังก์ชันนั้นไว้ใน ( ) ดังนี้
ชื่อเมท็อดที่ต้องการเรียกใช้(พารามิเตอร์);
สิ่งที่ต้องต้องรู้คือ
- เวลาที่เราส่งค่าพารามิเตอร์ไปให้เมท็อด ค่านั้นจะเป็นค่าเริ่มต้นของเมท็อดทันทีโดยแม้เมท็อดจะกำหนดค่าใหม่ก็ไม่ได้มีผลอะไร
รูป 6-1-1
บรรทัดที่ 6-7 : ตั้งค่าเริ่มต้นให้กับตัวแปร a และ b
บรรทัดที่ 9-10 : เรียกใช้เมท็อด set ที่รับพารามิเตอร์เป็นตัวแปรจำนวนเต็ม ใส่พารามิเตอร์เป็นตัว
แปร a และ b ลงไป
บรรทัดที่ 18 : ภายในเมท็อด set รับพารามิเตอร์เป็นตัวแปร b และตั้งค่า b เป็น 0
ผลลัพธ์ที่ได้
รูป 6-1-2
จะเห็นได้ว่าผลลัพธ์ที่ได้ยังเป็นเลขที่ส่งออกไปตั้งแต่แรกคือ a = 25 และ b = 60 การที่ทั้ง aและ b ไม่เกิดการเปลี่ยนแปลงก็เพราะว่าเมท็อดจะรับค่าตั้งต้นเป็นพารามิเตอร์จากจุดที่มีการเรียกใช้เมท็อด การเปลี่ยนแปลงที่เกิดขึ้นจากการตั้งค่าใหม่ในเมท็อดก็จะไม่เปลี่ยนค่าของตัวแปรไป และอีกประการคือตัวแปร b ที่กำหนดที่เมท็อด set ก็ถือว่าเป็นคนละตัวกับตัวแปร b ที่อยู่ในmain ด้วย
การเรียกใช้เมท็อดในคลาสอีกแบบคือการเรียกเมท็อดแบบสร้าง reference แบบที่ได้พูดถึงข้างบน
รูป6-1-3
บรรทัดที่ 8 : ประกาศตัวแปร x เป็นตัวแปรไม่ธรรมดา
บรรทัดที่ 9 : ให้ x เรียกเมท็อด print มาใส่ตัวเอง จากนั้นนำค่าไปเก็บใส่ a
การเรียกใช้เมท็อดต่างคลาสกัน
ในกรณีที่เราเขียนโปรแกรมที่มีขนาดใหญ่ๆซึ่งประกอบไปหลายๆคลาส บางครั้งเราก็ต้องการทำงานที่เหมือนๆกัน เช่น ในคลาส a เราเขียนเมท็อดสำหรับการบวก แต่เมื่อเราเขียนคลาส b เราก็ต้องการใช้งานเมท็อดสำหรับการบวกอีก ในจาวาสามารถที่จะเรียกใช้งานเมท็อดการบวกในคลาส a มาใช้ในคลาส b ได้เลยโดยไม่ต้องเขียนเมท็อดสำหรับการบวกใหม่ หรือก็คือของต่างคลาสกันสามารถใช้งานกันได้เพื่อจะได้ไม่ต้องเขียนเมท็อดเดิมเพิ่มขึ้นมาอีกครั้งหนึ่ง
แบบที่ 1 สร้างตัวแปรไม่ธรรมดา
class xx
{
public static void main(String args[]) {
ชื่อคลาสที่เมท็อดนั้นอยู่ a = new ชื่อคลาสที่เมท็อดนั้นอยู่();
}
}
หรืออาจเรียกใช้งานได้โดย การ new ขึ้นมาเลย
class xx
{
public static void main(String args[]) {
new ชื่อคลาสที่เมท็อดนั้นอยู่ ();
}
}
เมื่อสร้างตัวแปรของคลาสนั้นมาแล้วทำให้เครื่องหมาย “.” เพื่อ
class xx
{
public static void main(String args[]) {
ชื่อคลาสที่เมท็อดนั้นอยู่ a = new ชื่อคลาสที่เมท็อดนั้นอยู่ ();
a.เมท็อดที่ต้องการเรียกใช้();
}
ฟังก์ชันเรียกซ้ำ(Recursive function)
การเขียนฟังก์ชันมากๆ บางครั้งก็มีการเรียกใช้งานกันไปมาเช่น ฟังก์ชัน a เรียก ฟังก์ชัน b แต่ในฟังชัน b ก็มีการเรียกใช้งาน a และก็เป็นไปได้ที่ฟังก์ชันจะมีการเรียกตัวเองให้ทำงาน
ตัวอย่างการหาจำนวนฟิโบนัคชี(Fibonacci number) ด้วยการเขียนฟังก์ชันแบบเรียกซ้ำ
รูป 6-1-4
ในเมท็อด main ทำการวนลูปจาก 0-10 และเรียกใช้ฟังก์ชัน fibo เพื่อคำนวณหาเลขฟิโบนัคชี การเรียกซ้ำอยู่ตรงที่ บรรทัดที่ 19 จะให้หาค่าจนกว่าจะได้ตามที่เขียน ถ้าเขียนเมท็อดนี้ด้วย ลูปก็ได้แต่จะยาวและดูยากมาก
ผลลัพธ์จำนวนฟิโบนัคชี 10 ตัวแรก
รูป 6-1-5
Tag ที่น่าสนใจ: java_functions pass-by-value pass-by-reference recursive_function method_invocation java_classes programming_languages java_variables java_methods java_objects fibonacci_number coding_examples variable_initialization method_parameters programming_concepts
หากมีข้อผิดพลาด/ต้องการพูดคุยเพิ่มเติมเกี่ยวกับบทความนี้ กรุณาแจ้งที่ http://m.me/Expert.Programming.Tutor
085-350-7540 (DTAC)
084-88-00-255 (AIS)
026-111-618
หรือทาง EMAIL: NTPRINTF@GMAIL.COM
Copyright (c) 2013 expert-programming-tutor.com. All rights reserved. | 085-350-7540 | 084-88-00-255 | ntprintf@gmail.com