1. ผ่านการโต้แย้ง
และตอนนี้ความสนุกก็เริ่มขึ้น คุณอาจทราบอยู่แล้วจากวิธีการเช่นนั้นSystem.out.println()
ว่าเราสามารถส่งข้อโต้แย้งไปยังวิธีการได้ เมื่อเราเข้าไปในเมธอดแล้ว เราจะเรียกมันว่าพารามิเตอร์ อันที่จริงแล้ว พารามิเตอร์ช่วยเพิ่มประโยชน์ที่เราได้รับจากการสร้างและการใช้เมธอดอย่างมาก
เราจะประกาศเมธอดด้วยพารามิเตอร์ได้อย่างไร? จริงๆแล้วมันค่อนข้างง่าย:
public static void name(parameters)
{
method body
}
name
ชื่อเฉพาะของเมธอดอยู่ที่ไหน และ method body
แสดงถึงคำสั่งที่ประกอบเป็นเมธอด และparameters
เป็นตัวยึดสำหรับพารามิเตอร์เมธอด คั่นด้วยเครื่องหมายจุลภาค มาอธิบายรายละเอียดเพิ่มเติมเกี่ยวกับเทมเพลตนี้:
public static void name(Type1 name1, Type2 name2, Type3 name3)
{
method body
}
ตัวอย่าง:
รหัส | คำอธิบาย |
---|---|
|
เมธอดprint ถูกประกาศด้วยพารามิเตอร์:String str |
|
เมธอดprint ถูกประกาศด้วยพารามิเตอร์สองตัว:String str int count |
|
เมธอดwrite ถูกประกาศด้วยพารามิเตอร์สองตัว:int x int y |
หากเราไม่ต้องการให้เมธอดมีพารามิเตอร์ เราก็ปล่อยวงเล็บว่างไว้
พารามิเตอร์เป็นตัวแปรพิเศษภายในเมธอด ด้วยความช่วยเหลือ คุณสามารถส่งผ่านค่าต่างๆ ไปยังเมธอดเมื่อมันถูกเรียกใช้
ตัวอย่างเช่น ลองเขียนเมธอดที่แสดงสตริงข้อความตามจำนวนครั้งที่กำหนด
คุณรู้วิธีเขียนโค้ดเพื่อแสดงสตริงบนหน้าจอหลายครั้งแล้ว แต่คุณควรพิมพ์สตริงใด และกี่ครั้ง? นั่นคือสิ่งที่เราต้องการพารามิเตอร์
รหัสที่ทำสิ่งนี้จะมีลักษณะดังนี้:
รหัส | คำอธิบาย |
---|---|
|
เราประกาศ printLines เมธอดด้วยพารามิเตอร์ต่อไปนี้: String text , int count เมธอดแสดง text count เวลา สตริง เราเรียก printLines เมธอดด้วยพารามิเตอร์ต่างๆ |
แต่ละครั้งที่เมธอดถูกเรียกใช้ พารามิเตอร์ของเมธอดจะได้รับการกำหนดค่าที่ส่งผ่าน จากนั้นเราจะเริ่มดำเนินการคำสั่งภายในเมธอด
2. ข้อโต้แย้ง
ฉันต้องการดึงดูดความสนใจของคุณอีกเล็กน้อยเพื่อเรียกเมธอดด้วยพารามิเตอร์
ค่าที่ส่งผ่านไปยังเมธอดมักจะเรียกว่าอาร์กิวเมนต์เมื่อส่งผ่านไปยังเมธอด
ลองดูตัวอย่างอื่น:
รหัส | คำอธิบาย |
---|---|
|
เราประกาศ printLines เมธอดด้วยพารามิเตอร์ต่อไปนี้: String text , int count เมธอดแสดง text count เวลา สตริง เราเรียก printLines เมธอดด้วยอาร์กิวเมนต์ต่อไปนี้:text = "Hi"; count = 10; text = "Bye"; count = 20; |
เมื่อprintLines
เรียกใช้เมธอดเป็นครั้งแรก พารามิเตอร์จะถูกกำหนดค่าต่อไปนี้String text = "Hi", int count = 10
:
เมื่อprintLines
เมธอดถูกเรียกเป็นครั้งที่สอง พารามิเตอร์ของเมธอดจะถูกกำหนดค่าต่างๆ กันString text = "Bye", int count = 20
:
พารามิเตอร์ไม่มากและไม่น้อยไปกว่าตัวแปรที่กำหนดค่าบางอย่างเมื่อเรียกใช้เมธอด ค่า"Hi"
, "Bye"
, 10
และ20
เรียกว่าอาร์กิวเมนต์"
3. ชื่อตัวแปรที่ขัดแย้งกันเมื่อเรียกใช้เมธอด
ตัวแปรสามารถใช้เป็นอาร์กิวเมนต์เมธอด สิ่งนี้ง่ายและเข้าใจได้ แต่อาจทำให้เกิดปัญหาได้ กลับไปที่ตัวอย่างเดิม แต่คราวนี้เราจะย้ายอาร์กิวเมนต์ไปยังตัวแปรแยกกัน:
รหัส | คำอธิบาย |
---|---|
|
เราประกาศ printLines เมธอดด้วยพารามิเตอร์ต่อไปนี้: String text , int count เมธอดแสดง text count เวลา สตริง เราเรียก printLines เมธอดด้วยอาร์กิวเมนต์ต่อไปนี้:text = str; count = n; |
จนถึงตอนนี้ดีมาก: เรามีstr
ตัวแปร ค่าของมันถูกกำหนดให้กับtext
พารามิเตอร์เมื่อเรียกใช้เมธอด เรามีn
ตัวแปร ค่าของมันถูกกำหนดให้กับcount
พารามิเตอร์เมื่อเรียกใช้เมธอด" จนถึงตอนนี้ ทุกอย่างชัดเจน
ตอนนี้เรามาเปลี่ยนชื่อตัวแปรของเราในmain
เมธอด:
รหัส | คำอธิบาย |
---|---|
|
เราประกาศ printLines เมธอดด้วยพารามิเตอร์ต่อไปนี้: String text , int count เมธอดแสดง text count เวลา สตริง เราเรียก printLines เมธอดด้วยอาร์กิวเมนต์ต่อไปนี้:text = text; count = count; |
ให้ความสนใจกับสองสิ่ง
อันดับแรก: เรามีตัวแปรที่มีชื่อเดียวกันในเมธอดต่างๆ สิ่งเหล่านี้เป็น ตัวแปร ที่แตกต่างกัน (เราจงใจพรรณนาโดยใช้สีที่ต่างกัน) ทุกอย่างทำงานเหมือนกับในตัวอย่างก่อนหน้านี้ โดยที่ตัวแปรในเมธอดmain
ถูกตั้งชื่อstr
และn
ประการที่สอง: ไม่มีสิ่งมหัศจรรย์เกิดขึ้นเมื่อเมธอดถูกเรียก พารามิเตอร์ถูกกำหนดให้เป็นค่าอาร์กิวเมนต์ ไม่ว่าจะเป็นตัวเลข สตริง ตัวแปร หรือนิพจน์ก็ตาม
หลังจากที่เราเปลี่ยนชื่อตัวแปรในเมธอดหลักแล้ว ก็ไม่มีอะไรเปลี่ยนแปลง ก่อนหน้านี้ เป็นตัวแปรที่แตกต่างกันในวิธีการต่างๆและยังคงอยู่ ไม่มีการเชื่อมต่อเวทย์มนตร์ระหว่าง ตัวแปรtext
และtext
4. ผ่านการอ้างอิงถึงวิธีการ
ฉันหวังว่าคุณจะเข้าใจทุกอย่างจากบทเรียนที่แล้ว เพราะตอนนี้เราจะทบทวนการส่งผ่านอาร์กิวเมนต์ไปยังเมธอดอีกครั้ง แต่เราจะเจาะลึกลงไปเท่านั้น
ดังที่คุณทราบแล้ว ตัวแปร Java บางตัวไม่ได้จัดเก็บค่าเอง แต่แทนที่จะเป็นข้อมูลอ้างอิง เช่น ที่อยู่ของบล็อกหน่วยความจำซึ่งเป็นที่ตั้งของค่าต่างๆ นี่คือวิธีการทำงานของตัวแปรสตริงและตัวแปรอาร์เรย์
เมื่อคุณกำหนดตัวแปรอาร์เรย์อื่นให้กับตัวแปรอาร์เรย์ จะเกิดอะไรขึ้น ถูกตัอง. ตัวแปรสองตัวเริ่มอ้างถึงพื้นที่เดียวกันในหน่วยความจำ:
และจะเกิดอะไรขึ้นหากหนึ่งในตัวแปรเหล่านี้เป็นพารามิเตอร์เมธอด
รหัส | คำอธิบาย |
---|---|
|
เมธอด printArraySum จะคำนวณผลรวมของตัวเลขในอาร์เรย์ที่ส่งผ่านและแสดงผลบนหน้าจอ |
สิ่งเดียวกันนี้เกิดขึ้น: data
พารามิเตอร์จะมีการอ้างอิงไปยังพื้นที่หน่วยความจำเดียวกันกับmonths
ตัวแปร เมื่อเมธอดถูกเรียกใช้ การกำหนดอย่างง่ายจะเกิดขึ้น:data = months
และเนื่องจากตัวแปรทั้งสองอ้างถึงพื้นที่หน่วยความจำเดียวกันที่จัดเก็บจำนวนเต็ม ดังนั้นprintArraySum
เมธอดจึงไม่เพียงแต่อ่านค่าจากอาร์เรย์เท่านั้น แต่ยังเปลี่ยนแปลงค่าเหล่านั้นได้ด้วย!
ตัวอย่างเช่น เราสามารถเขียนเมธอดของเราเองที่เติมอาร์เรย์สองมิติด้วยค่าเดียวกัน นี่คือลักษณะที่ปรากฏ:
รหัส | คำอธิบาย |
---|---|
|
วิธี fill การวนซ้ำทุกเซลล์ในอาร์เรย์สองมิติที่ส่งผ่านและกำหนดให้value กับเซลล์เหล่านั้น เราสร้างอาร์เรย์สองมิติ เราเติมอาร์เรย์ทั้งหมดด้วย 8 ตัวเลข |
5. วิธีการที่มีชื่อเดียวกัน
ตอนนี้ขอกลับไปที่ชื่อเมธอดอีกครั้ง
มาตรฐาน Java กำหนดให้เมธอดทั้งหมดในคลาสเดียวกันมีชื่อไม่ซ้ำกัน กล่าวอีกนัยหนึ่ง เป็นไปไม่ได้ที่จะประกาศเมธอดที่มีชื่อเหมือนกันสองเมธอดในคลาสเดียวกัน
เมื่อเมธอดถูกเปรียบเทียบเพื่อความเหมือนกันไม่เพียงแต่ชื่อเท่านั้นที่จะนำมาพิจารณา แต่ยังรวมถึงประเภทของพารามิเตอร์ด้วย ! โปรดทราบว่าจะ ไม่นำชื่อของพารามิเตอร์มาพิจารณา ตัวอย่าง:
รหัส | คำอธิบาย |
---|---|
|
ทั้งสามวิธีนี้เป็นวิธีการที่แตกต่างกัน สามารถประกาศในคลาสเดียวกันได้ |
|
แต่ละวิธีในห้าวิธีนี้ถือว่าแตกต่างกัน สามารถประกาศในคลาสเดียวกันได้ |
|
เมธอดทั้งสองนี้ถือว่าเหมือนกันหมายความว่าไม่สามารถประกาศในคลาสเดียวกันได้ |
เหตุใดวิธีการบางอย่างจึงถือว่าเหมือนกันในขณะที่วิธีอื่นๆแตกต่างกัน และเหตุใดจึงไม่นำชื่อพารามิเตอร์มาพิจารณาเมื่อกำหนดความเป็นเอกลักษณ์ของเมธอด
ทำไมเอกลักษณ์จึงจำเป็น? สิ่งสำคัญคือเมื่อคอมไพเลอร์คอมไพล์โปรแกรม จะต้องรู้แน่ชัดว่าคุณต้องการเรียกใช้เมธอดใดในตำแหน่งใดก็ตาม
ตัวอย่างเช่น หากคุณเขียนคอมไพเลอร์จะฉลาดและสรุปได้ง่ายว่าคุณต้องการเรียกใช้เมธอดที่นี่ด้วยพารามิเตอร์System.out.println("Hi")
println()
String
แต่ถ้าคุณเขียนคอมไพเลอร์จะเห็นการเรียกใช้เมธอดพร้อมพารามิเตอร์System.out.println(1.0)
println()
double
เมื่อมีการเรียกใช้เมธอด คอมไพเลอร์จะตรวจสอบให้แน่ใจว่าประเภทของอาร์กิวเมนต์ตรงกับประเภทของพารามิเตอร์ มันไม่ใส่ใจกับชื่อของข้อโต้แย้ง ใน Java ชื่อพารามิเตอร์ไม่ได้ช่วยให้คอมไพลเลอร์กำหนดเมธอดที่จะเรียกใช้ และนั่นคือสาเหตุที่ไม่นำมาพิจารณาเมื่อกำหนดความเป็นเอกลักษณ์ของวิธีการ
ชื่อของเมธอดและประเภทของพารามิเตอร์เรียกว่าลายเซ็นเมธอด ตัวอย่างเช่น,sum(int, int)
แต่ละคลาสต้องมีเมธอดที่มีลายเซ็นเฉพาะมากกว่าเมธอดที่มีชื่อเฉพาะ
GO TO FULL VERSION