เหตุใดกลไกการควบคุมการเข้าถึงจึงออกแบบใน Java? มีสองฟังก์ชั่นหลัก:
(1) เพื่อให้ผู้ใช้หลีกเลี่ยงการสัมผัสชิ้นส่วนที่ไม่ควรสัมผัสชิ้นส่วนเหล่านี้จำเป็นสำหรับการดำเนินงานภายใน แต่ไม่ได้เป็นส่วนหนึ่งของส่วนต่อประสานที่โปรแกรมเมอร์ไคลเอนต์ต้องการ
(2) เพื่อให้นักออกแบบห้องสมุดชั้นเรียนเปลี่ยนการทำงานภายในของชั้นเรียนโดยไม่ต้องกังวลว่าจะมีผลกระทบอย่างมีนัยสำคัญต่อผู้ใช้
ระดับของการควบคุมการอนุญาตการเข้าถึงใน Java คือ:
สาธารณะ -> ได้รับการป้องกัน -> การเข้าถึงแพ็คเกจ (ไม่มีการแก้ไขการอนุญาต) -> ส่วนตัว
1. แพ็คเกจ
แนวคิดของแพ็คเกจใน Java นั้นคล้ายกับแนวคิดของเนมสเปซใน C ++ และทั้งคู่สามารถ จำกัด ขอบเขตของคลาสได้ ความแตกต่างที่ใหญ่ที่สุดระหว่างทั้งสองคือแพ็คเกจใน Java โดยปริยายระบุลำดับชั้นของต้นไม้ของคลาส (และโครงสร้างไดเรกทอรีของไฟล์ซอร์สโค้ด Java) ข้อดีของสิ่งนี้คือความเป็นเอกลักษณ์ของคลาสสามารถ จำกัด ได้โดยข้อกำหนดสำหรับความเป็นเอกลักษณ์ของพา ธ ไฟล์ในระบบไฟล์
1. องค์กรรหัส
เมื่อเขียนไฟล์ซอร์สโค้ด Java (ไฟล์. java) ไฟล์นี้มักจะเรียกว่าหน่วยรวบรวม ที่ชั้นเรียนสาธารณะส่วนใหญ่ได้รับอนุญาตในหน่วยการรวบรวมและชื่อของคลาสจะต้องเหมือนกับชื่อไฟล์ (รวมถึงตัวพิมพ์บนและล่าง)
เมื่อรวบรวมไฟล์. java แต่ละคลาสในไฟล์. java จะมีไฟล์เอาต์พุต. class และชื่อไฟล์และชื่อคลาสจะเหมือนกัน โปรแกรม Java Runnable เป็นชุดไฟล์. class ที่สามารถบรรจุและบีบอัดลงในไฟล์เอกสาร Java (แพ็คเกจ JAR โดยใช้เครื่องกำเนิดเอกสาร JAVA ของ Java) ล่าม Java รับผิดชอบการค้นหาการโหลดและการตีความไฟล์เหล่านี้
ไลบรารีคลาสเป็นชุดไฟล์คลาส ไฟล์. java แต่ละไฟล์ได้รับอนุญาตให้มีชั้นเรียนสาธารณะมากที่สุดหนึ่งคลาสรวมถึงคลาสที่ไม่ใช่สาธารณะจำนวนมาก ดังนั้นแต่ละไฟล์จึงมีสิ่งประดิษฐ์ หากคุณต้องการจัดระเบียบส่วนประกอบเหล่านี้ (แต่ละบิลด์มีไฟล์. java และไฟล์. class หลายไฟล์) เพื่อสร้างกลุ่มที่แตกต่างกันคุณสามารถใช้แพ็คเกจคำหลักใน Java
2. ฟังก์ชั่นของแพ็คเกจ
(1) จัดระเบียบคลาสหรืออินเทอร์เฟซที่มีฟังก์ชั่นที่คล้ายกันหรือที่เกี่ยวข้องในแพ็คเกจเดียวกันเพื่ออำนวยความสะดวกในการค้นหาและการใช้คลาส
(2) เช่นเดียวกับโฟลเดอร์แพ็คเกจยังใช้ไดเรกทอรีรูปต้นไม้เพื่อเก็บไว้ ชื่อคลาสในแพ็คเกจเดียวกันนั้นแตกต่างกันและชื่อของคลาสในแพ็คเกจที่แตกต่างกันอาจเหมือนกัน เมื่อคลาสที่มีชื่อคลาสเดียวกันในแพ็คเกจที่แตกต่างกันสองชุดในเวลาเดียวกันควรเพิ่มชื่อแพ็คเกจเพื่อแยกความแตกต่าง ดังนั้นแพ็คเกจสามารถหลีกเลี่ยงความขัดแย้งของชื่อ
(3) แพ็คเกจยัง จำกัด สิทธิ์การเข้าถึง เฉพาะคลาสที่มีสิทธิ์การเข้าถึงแพ็คเกจเท่านั้นที่สามารถเข้าถึงคลาสได้ในแพ็คเกจ
3. สร้างแพ็คเกจ
ใน Java ให้ใช้คีย์เวิร์ดแพ็คเกจเพื่อระบุแพ็คเกจ (เนมสเปซ) ซึ่งรหัสเป็นของ
รูปแบบไวยากรณ์:
แพ็คเกจ PKG1 [ PKG2 [ pkg3 …]];
บันทึก:
(1) ชื่อของแพ็คเกจชี้ให้เห็นโครงสร้างไดเรกทอรีของรหัสโดยปริยาย
(2) ชื่อคลาสสาธารณะ (เช่นชื่อไฟล์ Java) ในไดเรกทอรีเดียวกันควรไม่ซ้ำกัน
(3) การประกาศแพ็คเกจควรอยู่ในบรรทัดแรกของไฟล์ต้นฉบับ ไฟล์ต้นฉบับแต่ละไฟล์สามารถมีการประกาศแพ็คเกจเดียวเท่านั้นและแต่ละประเภทในไฟล์นี้จะถูกนำไปใช้
(4) หากไฟล์ต้นฉบับไม่ได้ใช้การประกาศแพ็คเกจแล้วคลาสฟังก์ชั่น enums ความคิดเห็น ฯลฯ จะถูกวางไว้ในแพ็คเกจที่ไม่มีชื่อ
(5) ชื่อของแพ็คเกจโดยทั่วไปอยู่ในตัวอักษรตัวพิมพ์เล็ก
ตัวอย่างเช่น:
ตรวจสอบซอร์สโค้ดของคลาส java.util.arraylist และคุณจะเห็นว่าบรรทัดแรกของไฟล์คือ:
แพ็คเกจ java.util;
โครงสร้างไดเรกทอรีรหัสคือ java/util/arraylist.java
4. การนำเข้าแพ็คเกจ
ใน Java ให้ใช้คำหลักนำเข้าเพื่อนำเข้าแพ็คเกจ
รูปแบบไวยากรณ์:
นำเข้าแพ็คเกจ 1 [.package2 …]. (classname |*);
ตัวอย่าง:
ลองใช้ java.util.arraylist เป็นตัวอย่าง มันไม่สะดวกมากที่จะใช้มันในแบบที่มีเส้นทางเต็มชั้น
java.util.arraylist <String> list = new Java.util.arrayList <String> ();
หากคุณต้องการละเว้นเส้นทางก่อนหน้าคุณสามารถใช้คำหลักนำเข้าได้
นำเข้า java.util.arraylist;
หลังจากนำเข้าแพ็คเกจในไฟล์รหัสก่อนหน้านี้ที่ประกาศรายการสามารถทำให้ง่ายขึ้นดังนี้:
ArrayList <String> list = new ArrayList <String> ();
2. ตัวดัดแปลงสิทธิ์การเข้าถึง
1. แพ็คเกจ: สิทธิ์การเข้าถึงแพ็คเกจ
หากไม่มีการปรับเปลี่ยนการเข้าถึงหมายความว่าเป็นการเข้าถึงแพ็คเกจ
การเข้าถึงเริ่มต้นไม่มีคำหลัก แต่มักจะหมายถึงการเข้าถึงแพ็คเกจ (บางครั้งก็แสดงเป็นมิตรเช่นแนวคิดขององค์ประกอบเพื่อนใน C ++) ซึ่งหมายความว่าคลาสอื่น ๆ ทั้งหมดในแพ็คเกจสามารถเข้าถึงสมาชิกหรือวิธีนี้ได้ แต่ไม่สามารถเข้าถึงคลาสทั้งหมดที่อยู่นอกแพ็คเกจนี้ได้
ตัวอย่าง:
com.notes.packages.test.info
แพ็คเกจ com.notes.packages.test; PublicClass Info {void print () {system.out.println ("วิธีการเริ่มต้น - พิมพ์ ()"); -com.notes.packages.test.publicDemo01
แพ็คเกจ com.notes.packages.test; publicclass publicdemo01 {publicstaticvoid main (string [] args) {info x = ข้อมูลใหม่ (); x.print (); -PublicDemo01 และข้อมูลสามารถเข้าถึงวิธีการระดับเริ่มต้นของข้อมูล - พิมพ์ () ภายใต้แพ็คเกจเดียวกัน
com.notes.packages.publicDemo02
แพ็คเกจ com.notes.packages; นำเข้า com.notes.packages.test.info; Publicclass PublicDemo02 {PublicStaticVoid Main (String [] args) {info x = ข้อมูลใหม่ (); // x.print (); // ข้อผิดพลาด }}PublicDemo02 และข้อมูลไม่ได้อยู่ในแพ็คเกจเดียวกันและวิธีการเข้าถึงแพ็คเกจการเข้าถึงแพ็คเกจของ Info ไม่สามารถเข้าถึงได้ - พิมพ์ ()
2. สาธารณะ: สิทธิ์การเข้าถึงส่วนต่อประสาน
การใช้คำหลักสาธารณะหมายความว่าทุกคนหรือวิธีการที่ประกาศให้ทุกคนสามารถเข้าถึงได้
ตัวอย่าง: หากการอนุญาตวิธีการพิมพ์ () ในตัวอย่างการอนุญาตระดับเริ่มต้นถูกตั้งค่าเป็นสาธารณะสามารถเข้าถึง PublicDemo02 ได้
แพ็คเกจ com.notes.packages.test; PublicClass Info {PublicVoid Print () {System.out.println ("วิธีการสาธารณะ - print ()"); -3. ส่วนตัว: ไม่สามารถเข้าถึงได้
การใช้คำหลักส่วนตัวหมายความว่าสมาชิกที่ประกาศหรือวิธีการไม่สามารถเข้าถึงได้สำหรับคลาสอื่น ๆ ยกเว้นคลาสนี้
สถานการณ์แอปพลิเคชัน: โหมดซิงเกิลตัน
4. ได้รับการป้องกัน: สืบทอดการเข้าถึงสิทธิ์
คลาสใหม่ (เรียกว่าคลาสเด็กหรือคลาสที่ได้รับ) สามารถนำคลาสที่มีอยู่กลับมาใช้ใหม่ (เรียกว่าคลาสแม่หรือคลาสพื้นฐาน) ผ่านการสืบทอดจากนั้นขยายสมาชิกและวิธีการของคลาสฐาน บางครั้งผู้สร้างคลาสฐานจะต้องการให้สมาชิกเฉพาะเพื่อกำหนดการเข้าถึงคลาสที่ได้รับแทนที่จะเป็นคลาสทั้งหมด สาธารณะไม่สามารถทำสิ่งนี้ได้และเพื่อจุดประสงค์นี้ได้รับการปกป้องให้ทำงาน การป้องกันยังให้การเข้าถึงแพ็คเกจนั่นคือคลาสที่ได้รับและคลาสอื่น ๆ ภายในแพ็คเกจเดียวกันสามารถเข้าถึงสมาชิกหรือวิธีการที่ได้รับการป้องกัน
ตัวอย่าง: หลังจากคลาสย่อยสืบทอดคลาสพาเรนต์มันสามารถเข้าถึงสมาชิกที่ได้รับการป้องกันของคลาสแม่
ชั้นเรียนพ่อ {สตริงส่วนตัว a = "ส่วนตัว"; สตริงที่ได้รับการป้องกัน b = "ป้องกัน"; สตริงสาธารณะ c = "สาธารณะ";}; Class Son ขยายพ่อ {publicvoid print () {// system.out.println ("องค์ประกอบ A:" + super.a); // ข้อผิดพลาด System.out.println ("องค์ประกอบ B:" + super.b); System.out.println ("องค์ประกอบ C:" + super.c); }} PublicClass ProtectedDemo01 {PublicStaticVoid Main (String args []) {son sub = ลูกชายคนใหม่ (); sub.print (); -หมายเหตุเกี่ยวกับตัวดัดแปลงการเข้าถึง
ในตัวอย่างก่อนหน้านี้สมาชิกและวิธีการของชั้นเรียนสามารถแก้ไขได้ด้วยตัวดัดแปลงการอนุญาตต่างๆ
นอกจากนี้ยังมีบางจุดที่ให้ความสนใจกับ:
(1) การใช้ตัวดัดแปลงการอนุญาตสำหรับสมาชิกแบบคงที่และวิธีการคงที่เหมือนกับของสมาชิกสามัญและวิธีการ
(2) แม้ว่าคลาสจะสามารถแก้ไขได้โดยตัวดัดแปลง แต่ไม่สามารถใช้คำวาทศิลป์ที่ได้รับอนุญาตทั้งสองและไม่สามารถใช้งานได้
(3) ในหนังสือบางเล่มการเข้าถึงแพ็คเกจเรียกอีกอย่างว่าการเข้าถึงเริ่มต้น โดยส่วนตัวแล้วฉันไม่แนะนำให้จดจำด้วยวิธีนี้เพราะมันสับสนกับคุณสมบัติใหม่ของ Java SE8 - คำหลักเริ่มต้น คำหลักนี้สามารถใช้สำหรับอินเทอร์เฟซเท่านั้นและฟังก์ชั่นของมันคือการอนุญาตให้โปรแกรมเมอร์กำหนดการใช้งานเริ่มต้นของอินเทอร์เฟซในอินเทอร์เฟซ (ในเวอร์ชัน JDK ที่ผ่านมาไม่อนุญาตให้ใช้สิ่งนี้คุณสามารถประกาศวิธีการในอินเทอร์เฟซเท่านั้น)
ข้างต้นเป็นเรื่องเกี่ยวกับบทความนี้ฉันหวังว่ามันจะเป็นประโยชน์กับการเรียนรู้ของทุกคน