ตัวอย่างการบรรยายพร้อมผู้ให้คำปรึกษาซึ่งเป็นส่วนหนึ่งของหลักสูตร Codegym University ลงทะเบียนสำหรับหลักสูตรเต็ม


"สวัสดี Amigo! ฉันได้ยินมาว่าคุณมีวิธีการที่ดีอยู่แล้ว?"

“สวัสดี ฤๅษี ใช่ ฉันได้ตัดทางของอาจารย์คนนั้นไปแล้ว จะบอกว่ามันไม่ได้เลวร้ายนัก แต่เธอจะบอกว่า 'ไม่ ไม่ ไม่! คุณไม่ได้คิดอะไรเลย '"

"เห็นได้ชัดว่าคุณใช้เวลามากเกินไปในการพูดคุยกับอาจารย์บางคน ซึ่งอาจจะเป็นกับดิเอโก อย่างไรก็ตาม... ฉันยังหวังว่าคุณจะเข้าใจวิธีการดีพอ เพราะงั้น วันนี้ฉันจะสอนคำศัพท์วิเศษที่ช่วยวิเคราะห์วิธีการ 'ขอบเขตของอิทธิพล'

"ฟังดูน่าสนใจ"

"ความจริงแล้ว มันง่ายมาก ก่อนที่แต่ละวิธี โปรแกรมเมอร์สามารถระบุสิ่งที่เรียกว่าตัวดัดแปลงการเข้าถึงได้ ซึ่งรวมถึงคำหลักต่อไปนี้: public, protected, private.

"ตัวดัดแปลงการเข้าถึงเหล่านี้ช่วยให้คุณจำกัดการเข้าถึงเมธอดของคลาสอื่น

"ตัวอย่างเช่น หากคุณเขียนprivateคีย์เวิร์ดก่อนการประกาศเมธอด เมธอดนั้นสามารถเรียกได้จากคลาสเดียวกับที่มีการประกาศเท่านั้น คีย์เวิร์ดpublicอนุญาตให้เข้าถึงเมธอดที่ทำเครื่องหมายจากเมธอดใดๆ ของคลาสใดก็ได้

ตัวดัดแปลงดังกล่าวมีทั้งหมด 3 ตัว แต่มีการเข้าถึงเมธอด 4 ประเภท นี่เป็นเพราะการไม่มีตัวดัดแปลงการเข้าถึงก็หมายถึงบางสิ่งเช่นกัน นี่คือตารางที่สมบูรณ์:

เข้าได้จาก...
การปรับเปลี่ยน ชั้นใดก็ได้ ชั้นเรียนเด็ก แพ็คเกจของมัน คลาสของมัน
public ใช่ ใช่ ใช่ ใช่
protected เลขที่ ใช่ ใช่ ใช่
ไม่มีการปรับเปลี่ยน เลขที่ เลขที่ ใช่ ใช่
private เลขที่ เลขที่ เลขที่ ใช่

"และนี่คือคำอธิบายที่สมบูรณ์ของตัวแก้ไขการเข้าถึง:

1. publicตัวดัดแปลง

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

2. privateตัวดัดแปลง

เมธอด (หรือตัวแปร หรือคลาส) ที่ทำเครื่องหมายด้วยตัวprivateแก้ไขจะสามารถเข้าถึงได้จากคลาสเดียวกันที่มีการประกาศ เท่านั้น สำหรับคลาสอื่นๆ ทั้งหมด เมธอด (หรือตัวแปร) ที่ทำเครื่องหมายไว้จะมองไม่เห็น ราวกับว่ามันไม่มีอยู่จริง นี่เป็นข้อจำกัดระดับสูงสุด — เฉพาะคลาสของตัวเองเท่านั้น

3. ไม่มีตัวแก้ไข (ตัวแก้ไขเริ่มต้น)

หากเมธอด (หรือตัวแปร) ไม่ถูกทำเครื่องหมายด้วยตัวปรับแต่งใดๆ ก็จะถือว่ามี 'ตัวปรับแต่งเริ่มต้น' ตัวแปรหรือเมธอดที่มีตัวแก้ไขนั้น (เช่นไม่มีเลย) สามารถ มอง เห็นได้ในทุกคลาสในแพ็คเกจที่มีการประกาศ และสำหรับพวกเขาเท่านั้น โมดิฟายเออร์นี้บางครั้งเรียกว่าpackage-privateเป็นการบอกใบ้ว่าการเข้าถึงตัวแปรและเมธอดนั้นเปิดให้กับแพ็คเกจทั้งหมดที่มีคลาสของมันอยู่

4. protectedตัวดัดแปลง

หากเมธอดถูกทำเครื่องหมายด้วยprotectedตัวดัดแปลง จะสามารถเข้าถึงได้จากคลาสเดียวกัน แพ็คเกจเดียวกัน และลูกหลาน (คลาสที่สืบทอดคลาสที่มีการประกาศเมธอด) เราจะวิเคราะห์หัวข้อนี้อย่างละเอียดในภารกิจ Java Core"

"น่าสนใจ แต่ฉันไม่แน่ใจว่าฉันจะใส่ตัวดัดแปลงเหล่านี้ในตำแหน่งที่เหมาะสมทั้งหมดได้ทันทีหรือไม่

"คุณจะไปถึงที่นั่นอย่างค่อยเป็นค่อยไป ไม่ต้องกังวลล่วงหน้า จนกว่าคุณจะไปถึงจุดสิ้นสุดของภารกิจ Java Syntax คุณสามารถใช้ตัวปรับแต่งpublicกับวิธีการทั้งหมดของคุณ (เช่นเดียวกับคลาสและตัวแปรอินสแตนซ์) คุณจะต้องใช้ ตัวดัดแปลงอื่นๆ เมื่อเราเริ่มเรียนรู้ OOP อย่างกระตือรือร้น"

"คุณช่วยอธิบายรายละเอียดเพิ่มเติมได้ไหมว่าทำไมต้องมีตัวดัดแปลงการเข้าถึง"

"พวกเขากลายเป็นสิ่งจำเป็นสำหรับโครงการขนาดใหญ่ที่เขียนโดยโปรแกรมเมอร์หลายสิบหลายร้อยคนในเวลาเดียวกัน

"บางครั้งมีสถานการณ์ที่โปรแกรมเมอร์ต้องการแยกเมธอดที่มีขนาดใหญ่เกินไปออกเป็นส่วนๆ และย้ายโค้ดบางส่วนไปเป็นวิธีตัวช่วย แต่ในขณะเดียวกัน เขาหรือเธอไม่ต้องการให้โปรแกรมเมอร์คนอื่นเรียกเมธอดตัวช่วยเหล่านี้ เนื่องจาก รหัสที่เกี่ยวข้องอาจทำงานไม่ถูกต้อง"

"ดังนั้นพวกเขาจึงคิดตัวแก้ไขการเข้าถึงเหล่านี้ขึ้นมา หากคุณทำเครื่องหมายเมธอดตัวช่วยด้วยคำว่าprivateจะไม่มีโค้ดอื่นนอกจากคลาสของคุณที่จะเห็นเมธอดตัวช่วยของคุณ"

"ฉันคิดว่าฉันเข้าใจ."

staticคำสำคัญ

"มีคำหลักที่น่าสนใจอีกคำหนึ่ง มันคือstaticไม่น่าแปลกใจเลย ที่ทำให้วิธีการคงที่"

"นั่นหมายความว่าอย่างไร?"

"ฉันจะบอกคุณเพิ่มเติมเกี่ยวกับเรื่องนี้ในภายหลัง ไม่ต้องกังวล สำหรับตอนนี้ พยายามจำข้อเท็จจริงสองสามข้อเกี่ยวกับวิธีการแบบสแตติก

ความจริง 1.วิธีการแบบคงที่ไม่ได้แนบกับวัตถุใด ๆ แต่เป็นของคลาสที่มีการประกาศแทน หากต้องการเรียกใช้เมธอดแบบคงที่ คุณต้องเขียน:

ClassName.MethodName()

ตัวอย่างของวิธีการแบบคงที่:

ชื่อชั้น ชื่อเมธอดแบบสแตติก
Thread.sleep() Thread sleep()
Math.abs() Math abs()
Arrays.sort() Arrays sort()

ชื่อคลาสก่อนหน้าชื่อของเมธอดสแตติกสามารถละเว้นได้ หากคุณเรียกเมธอดสแตติกจากภายในคลาส นี่คือเหตุผลที่คุณไม่จำเป็นต้องเขียนSolutionก่อนชื่อของแต่ละเมธอดแบบสแตติกที่ถูกเรียก

ความจริง 2วิธีการแบบคงที่ไม่สามารถเข้าถึงวิธีการที่ไม่ใช่แบบคงที่ของคลาสของตัวเอง เมธอดสแตติกสามารถเข้าถึงเมธอดสแตติกเท่านั้น ด้วยเหตุนี้ เราจึงประกาศเมธอดทั้งหมดที่เราต้องการเรียกจากเมธอดmainสแตติก"

"ทำไมล่ะ?"

"คุณจะตอบคำถามนี้ด้วยตัวเองเมื่อคุณเริ่มเรียนรู้ OOP และเข้าใจว่าเมธอดสแตติกทำงานอย่างไร จนกว่าจะถึงตอนนั้น เชื่อฉันเถอะ

throwsคำสำคัญ

"มีคำหลักอีกคำหนึ่งที่คุณอาจเห็นในการประกาศเมธอด นั่นคือthrowsคำหลัก ซึ่งแตกต่างจากตัวแก้ไขการเข้าถึงและstaticคำหลัก คำหลักนี้จะถูกวางไว้หลังพารามิเตอร์เมธอด:

public static Type name(parameters) throws Exception
{
  method body
}

"แล้วมันหมายความว่ายังไง"

"ฉันต้องบอกคุณอีกครั้งว่า คุณจะได้เรียนรู้จุดประสงค์ที่แท้จริงของมันในภายหลัง เมื่อเราศึกษาข้อยกเว้น (ในระดับ 15)

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

"ฟังดูลึกลับและเข้าใจยาก! ฉันจะต้องรอเลเวล 14"

วิธีการหลัก

"ตอนนี้มาดูเมธอดหลักให้ละเอียดยิ่งขึ้น คุณเข้าใจแล้วว่าบรรทัดที่มีการประกาศเมธอดซึ่งมีตัวดัดแปลงทั้งหมดจะส่งผลต่อวิธีการเรียกเมธอดนี้จากคลาสและเมธอดอื่นๆ นอกจากนี้ยังส่งผลต่อประเภทของ ผลลัพธ์เมธอดจะส่งคืนและระบุว่าข้อผิดพลาดใดที่เป็นไปได้เมื่อรัน

"บรรทัดดังกล่าวเรียกว่าการประกาศเมธอดและมีรูปแบบทั่วไปดังต่อไปนี้:

access modifier static Type name(parameters) throws exceptions
รูปแบบทั่วไปของการประกาศเมธอด

โดยที่access modifiersจะถูกแทนที่ด้วยpublic, protected, private, หรือไม่มีอะไรเลย

หากเมธอดเป็นแบบคงที่staticคำหลักจะปรากฏขึ้น (ไม่มีสำหรับเมธอดแบบไม่คงที่)

Typeเป็นประเภทของค่าที่ส่งคืน ( voidหากไม่มีผลลัพธ์)

"ตอนนี้คุณมีความเข้าใจที่ดีขึ้นมากว่าคำเหล่านี้หมายถึงอะไรในการประกาศวิธีmainการ:

public static void main(String[] args) throws Exception
ประกาศmainวิธีการ

"ตอนนี้ฉันรู้แล้วว่าการเข้าถึงmain()เมธอดนั้นเป็นไปได้จากคลาสใดก็ได้ ตามที่ระบุโดยpublicคีย์เวิร์ด เมธอดเป็นแบบสแตติก ดังนั้นจึงสามารถเรียกอย่างชัดเจนว่าSolution.main()"

"ผลลัพธ์ของmain()เมธอดคืออะไร"

"ไม่มีเลย! ประเภทของผลลัพธ์คือvoidเหมือนกับประเภทว่างเปล่า ตัวยึดตำแหน่ง"

"มีอะไรmain()อยู่ในวงเล็บ"

"อืม... ปรากฎว่าmainเมธอดใช้อาร์กิวเมนต์ (!) พวกมันจะถูกส่งผ่านเป็นอาร์เรย์ของสตริง"

"ถูกต้อง และชื่อพารามิเตอร์argsก็บ่งบอกถึง 'อาร์กิวเมนต์' ในใจของเรา เมื่อโปรแกรมเริ่มทำงาน คุณสามารถส่งอาร์กิวเมนต์ให้มันเป็นอาร์เรย์ของสตริง พวกมันจะถูกบรรจุอยู่ในอาร์เรย์argsในmain()เมธอด"

"โอ้โห! ฉันสงสัยเรื่องนี้ตอนที่เห็นครั้งแรก แต่หลังจากนั้นฉันก็ชินและเริ่มเขียนรายการพารามิเตอร์โดยไม่ต้องคิด"

"เราทุกคนเคยผ่านมาแล้ว ในที่สุด ข้อผิดพลาดที่ไม่สามารถจัดการได้ เช่นException(หรือสิ่งที่ตามมา) สามารถเกิดขึ้นได้ในmain()เมธอด เรารู้เรื่องนี้ด้วยthrows Exceptionส่วนหนึ่งของการประกาศ"

"ขอบคุณ Rishi ฉันไม่เข้าใจทุกอย่าง แต่สิ่งนี้น่าสนใจ"

"ยินดีต้อนรับ คุณจะต้องค่อย ๆ เข้าใจประเด็นที่ละเอียดอ่อนเหล่านี้ ฉันแน่ใจ"