6.1 ฟังก์ชัน(ต่อ)

___________________

รับสอนเขียนJAVA , C# , VB.net

โทร 0853507540

___________________

6.1 ฟังก์ชัน(ต่อ)

ต่อไปนี้จะเป็นการพูดถึงในส่วนที่เหลือที่เกี่ยวข้องกับฟังก์ชัน ได้แก่ การเรียกใช้ฟังก์ชันทั้งจากภายในคลาสเดียวกันและจากต่างคลาสกัน อีกเรื่องได้ฟังก์ชันเรียกซ้ำ(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

 


[1] การชี้หมายถึงชี้ยัง memory ที่ตัวแปรจองตำแหน่งไว้ใน heap memory

 

แผนผังการเรียนเขียนโปรแกรม

 

___________________

รับสอนเขียนJAVA , C# , VB.net

โทร 0853507540

___________________

 

ใส่ความเห็น