มีคลาสภายในของ Java ภายใน 4 รูปแบบที่เราใช้โดยทั่วไป: คลาสภายในทั่วไปคลาสภายในท้องถิ่นคลาสภายในที่ไม่ระบุชื่อและคลาสภายในแบบคงที่ ต่อไปนี้คือการทดสอบที่ฉันทำเพื่อแสดงให้เห็นถึงลักษณะของชั้นเรียนภายในต่างๆ
เกี่ยวกับลักษณะของคลาสภายในรหัสจะอธิบายอย่างละเอียดดังนี้
/** การทดสอบคลาส Java ภายใน** interoBj ผลการสะท้อน:** ส่วนตัว int i* private interoBj $ intera ia* public interobj ()* โมฆะสาธารณะคงที่หลัก (java.lang.string [])* int ส่วนตัว geti ()* โมฆะสาธารณะ p ()* โมฆะสาธารณะ pi () Void PPPP ()* ด้านล่างคือคอมไพเลอร์ที่สร้างขึ้นโดยอัตโนมัติวิธีการคงที่สำหรับการเข้าถึงแอตทริบิวต์ส่วนตัวหรือวิธีแพคเกจระดับ* การเข้าถึง int แบบคงที่ $ 0 (interobj)*/คลาสสาธารณะ interobj {ส่วนตัว int i = 8; intera ส่วนตัว = null; interoBj () {ia = ใหม่ intera () p () {pi (); pp (); ppp (); pppp (); pppp ();}/ * * ในคลาสภายในทั่วไปวิธีการและคุณสมบัติสามารถเข้าถึงได้ทุกระดับใน "คลาสเสื้อโค้ท" คลาสแจ็คเก็ตยังสามารถ* วิธีการเข้าถึงและคุณสมบัติในทุกระดับใน "คลาสภายใน" เพราะคลาสด้านในสามารถอ้างอิงถึงวัตถุคลาสเสื้อโค้ท * สำหรับวิธีการส่วนตัวและแอตทริบิวต์ที่จำเป็นต้องเข้าถึงโดยคลาสภายในคอมไพเลอร์จะสร้างวิธีการคงที่ "แพ็คเกจ"-ระดับคงที่โดยอัตโนมัติซึ่งสอดคล้องกับ * วิธีการส่วนตัวและแอตทริบิวต์ วิธีการเหล่านี้จำเป็นต้องใช้วัตถุคลาสภายนอกเป็นพารามิเตอร์ * เพื่อให้คุณสามารถเข้าถึงวิธีการส่วนตัวและแอตทริบิวต์ * ในคลาสด้านนอกในวิธีการ "แพ็คเกจ"-ระดับคงที่ระดับ * หลักการเดียวกันนั้นเหมือนกันสำหรับคลาสแจ็คเก็ตเพื่อเข้าถึงวิธีการส่วนตัวและคุณสมบัติในชั้นเรียนชั้นใน เมื่อรวบรวมคลาสด้านใน * จะสร้าง "แพ็คเกจ"-วิธีการคงที่ระดับที่สอดคล้องกับวิธีการส่วนตัวและคุณสมบัติที่ต้องเข้าถึงโดยคลาสแจ็คเก็ต * * ผลการสะท้อนระหว่างอินเตอร์: * int ia ส่วนตัว * ด้านล่างคือการอ้างอิงของวัตถุคลาสเสื้อโค้ทที่จัดขึ้นโดยคลาสภายใน * final interoBj นี้ $ 0 * ใช้วัตถุคลาสเสื้อโค้ทเป็นพารามิเตอร์ในคอนสตรัคเตอร์ * interoBj $ intera (interoBj) pa1 () * */คลาส intera {private int ia = 9; โมฆะส่วนตัว pa () {system.out.println ("นี่คือ intera.pa: ia ="+ia+", interobj.i ="+geti ()); ia = "+ia+", interobj.i = "+geti ());}}/ * * คลาสภายในท้องถิ่นสามารถมองเห็นได้ภายในวิธีการภายในและคุณสมบัติอื่น ๆ จะเหมือนกับคลาสภายในทั่วไป * สำหรับตัวแปรท้องถิ่นที่จำเป็นต้องเข้าถึงจะต้องตั้งค่าเป็นรอบชิงชนะเลิศเพราะแม้ว่าคลาสภายในท้องถิ่นสามารถเก็บข้อมูล * ไปยังวัตถุชั้นนอกเพื่อเข้าถึงคุณสมบัติและวิธีการ แต่ไม่สามารถเข้าถึงตัวแปรท้องถิ่นในเมธอดคลาสภายนอก คอมไพเลอร์ทั้งหมด "คัดลอก" สำเนาของตัวแปรท้องถิ่นที่จำเป็นต้องเข้าถึงในคลาสภายในท้องถิ่น (แต่ไม่มีสำเนาสำหรับประเภทที่มีประเภทพื้นฐาน int, ลอยและสตริง * ไม่เปลี่ยนแปลง) เพื่อให้แน่ใจว่าค่าตัวแปรที่คัดลอกและวัตถุ * ชี้ไปที่ค่าของตัวแปรในวิธีภายนอกเป็นวัตถุเดียวกันจำเป็นต้องมีตัวแปรท้องถิ่นที่ใช้โดยคลาสท้องถิ่นควรตั้งค่าเป็นขั้นสุดท้ายและไม่สามารถแก้ไขได้ * เพื่อให้แน่ใจว่าตัวแปรคัดลอกในส่วนท้องถิ่น การตั้งค่าตัวแปร * เป็นขั้นสุดท้ายควบคุมเฉพาะที่ที่อยู่วัตถุที่ชี้ไปที่ตัวแปรยังคงไม่เปลี่ยนแปลงมากกว่าคุณสมบัติภายในของวัตถุที่ชี้ให้ไม่สามารถเปลี่ยนแปลงได้ * * ผลการสะท้อนของ interb: * * int ส่วนตัว ib * ด้านล่างคือการอ้างอิงของวัตถุคลาสเสื้อโค้ทที่จัดขึ้นโดยคลาสภายใน * interoBj สุดท้ายนี้ $ 0 * ด้านล่างเป็นสำเนาอ้างอิงของวัตถุทดสอบตัวแปรท้องถิ่นในวิธีการภายนอกที่จัดขึ้นโดยคลาสการทดสอบภายใน $ 1 ด้านล่างคือคอมไพเลอร์จะสร้างวิธีการคงที่โดยอัตโนมัติสำหรับการเข้าถึงคุณสมบัติส่วนตัวหรือแพ็คเกจเมธอดระดับ * โมฆะคงที่การเข้าถึง $ 0 (interobj $ 1 $ interb) */โมฆะสาธารณะ pi () {สุดท้าย int s = 5; ทดสอบการทดสอบครั้งสุดท้าย = การทดสอบใหม่ () class interb {ส่วนตัว int ib = 7; ", (วิธีการ) pi.s ="+s+", test.t ="+test.gett ());}} interb ib = new interb (); // สิ่งนี้เปลี่ยนสถานะภายในของการทดสอบทดสอบที่อ้างอิงโดยคลาสภายในท้องถิ่น // เมื่อผลลัพธ์ถูกเรียกว่า ib.pb () เอาต์พุตคือค่าที่เปลี่ยนแปลง 100test.sett (100); ib.pb ();}/ * คลาสภายในแบบคงที่ใช้เมื่อไม่จำเป็นต้องอ้างอิงถึง "วัตถุคลาสเสื้อโค้ท" * * ผลการไตร่ตรองระหว่างอินเตอร์: (คลาสชั้นในแบบคงที่ไม่มีการอ้างอิงถึงวัตถุคลาสเสื้อโค้ท) * int private int iC * interc () * โมฆะส่วนตัวพีซี () */คลาสคงที่ interc {ส่วนตัว int iC = 6; โมฆะส่วนตัวพีซี () {system.out.println ("นี่คือ interc.pc: ic ="+ic) * คุณสามารถเข้าถึงการอนุญาตใด ๆ ในคลาสภายใน*/โมฆะสาธารณะ pp () {intera ia = new intera (); ia.pa (); ia.pa1 (); อินเตอร์อินเตอร์ = นิวอินเตอร์อินเตอร์ (); ic.pc () * คุณไม่สามารถสร้างคลาสภายในที่ไม่คงที่เนื่องจากไม่มีวัตถุในวิธีการคงที่ที่หมายถึง "คลาสเสื้อโค้ท" เพื่อสร้าง * วัตถุชั้นในที่ต้องอ้างอิงโดยวัตถุคลาสเสื้อโค้ท */โมฆะคงที่สาธารณะ ppp () {// intera ia = new intera (); // แต่สามารถสร้างได้ดังนี้: interobj iobj = ใหม่ interoBj (); intera ia = iobj.new intera (); ia.pa (); ib = new interb ();}/ * * การทดสอบคลาสภายในไม่ระบุชื่อ */โมฆะสาธารณะ pppp () {testinterface tif = testinterface ใหม่ () {โมฆะสาธารณะ pppp () {system.out.println ("testinterface.noname");}}; ib = 7, (วิธีการ) pi.s = 5, test.t = 100 * นี่คือ intera.pa: ia = 9, interoBj.i = 8 * นี่คือ intera.pa1: ia = 9, interobj.i = 8 * นี่คือ interc.pc: ic = 6 * นี่คือ intera.pa: ia = 9, interobj.i = 8 * นี่คือ interc.pc: ic = 6*testinterface.noname*/โมฆะคงที่สาธารณะหลัก (สตริง [] args) {interobj io = ใหม่ interobj (); io.p ();}}/** อินเทอร์เฟซสำหรับคลาสการทดสอบภายในคลาส int gett () {return t;} public void sett (int t1) {t = t1;}}ให้ฉันแบ่งปันตัวอย่างอื่น:
คลาสสาธารณะ innerclass {toy toy static toy = toy ใหม่ () {string name = "lao wu";@override โมฆะสาธารณะกระโดดข้าม () {system.out.println (ชื่อ+"แตกออกจากโลก"); ไป ();}};/*ชั้นเรียนภายใน คลาสสมาชิกภายใน: *1.1 คลาสสมาชิกภายในสามารถเข้าถึงคุณสมบัติของคลาสภายนอก *1.2 เข้าถึงวัตถุปัจจุบันของคลาสภายนอกผ่านชื่อคลาสภายนอก วิธีนี้ * สมาชิกคลาสภายในคลาสอินสแตนซ์ของสมาชิก: ชื่อคลาสภายนอก ชื่ออ้างอิงชื่อคลาสภายใน = Object คลาสภายนอกชื่อคลาสภายใน ();); *2. คลาสภายในแบบคงที่*2.1 ทรัพยากรสมาชิกของคลาสภายนอกไม่สามารถเข้าถึงได้ภายในคลาสภายในแบบคงที่และสามารถเข้าถึงทรัพยากรคงที่ของคลาสภายนอกผ่านชื่อคลาส*วัตถุอินเนอเรชั่นชั้นในแบบคงที่: ชื่อคลาสภายนอก ชื่อคลาสอ้างอิงคลาสภายใน = ชื่อคลาสภายนอกใหม่ ชื่อชั้นเรียนภายใน (); *3. คลาสภายในชั้นใน:*3.1 คุณยังสามารถเข้าถึงคุณสมบัติโดยตรงของคลาสภายนอก*3.2 คุณยังสามารถเข้าถึงวัตถุปัจจุบันของคลาสภายนอก*3.3 คลาสภายในท้องถิ่นสามารถเข้าถึงได้ภายในวิธีการเท่านั้นและตัวดัดแปลงสามารถเป็นค่าเริ่มต้น*4 เท่านั้น คลาส Inner ที่ไม่ระบุชื่อ: เมื่อจำเป็นต้องใช้อินสแตนซ์คลาสย่อยเฉพาะของคลาสที่ต้องการคลาสจะถูกสร้างขึ้นชั่วคราวโดยใช้ * ชื่อคลาสใหม่ () { * วิธีการเขียนทับ; - *4.1 คลาสภายในที่ไม่ระบุชื่อเข้าถึงคุณสมบัติของวิธีการภายนอกและคุณสมบัตินี้จะถูกแปลงเป็นค่าคงที่*4.2 คุณลักษณะและวิธีการใหม่ที่เพิ่มเข้ามาในชั้นเรียนภายในที่ไม่ระบุชื่อและสามารถใช้ภายในชั้นเรียนที่ไม่ระบุชื่อได้ คอมพิวเตอร์ ("เอเลี่ยน"); person.computer PC1 = บุคคลใหม่ ("Jian Zihao", 18). คอมพิวเตอร์ใหม่ ("Alien"); pc.rungame (); pc1.rungame (); person.computer1 pc11 = บุคคลใหม่ "rokudou"; คอมพิวเตอร์ com = คอมพิวเตอร์ใหม่ () {@override public void rungame () {// toDo วิธีการที่สร้างอัตโนมัติ auto-stubsystem.out.println (per.age+"ปี"+per.name+"การเล่น lalalala demasita"); คลาส/*toy toy = toy ใหม่ () {@Override โมฆะสาธารณะกระโดด () {system.out.println ("แตกออกจากโลก"); }};*/toy.jump (); toy.jump (); // toy.go (); // system.out.println (ของเล่น.);}} คนในชั้นเรียน {ชื่อสตริง; อายุ int; int int 1 = 18 playgame () {system.out.println (ชื่อ+"เล่นเกม");} คอมพิวเตอร์คลาสสาธารณะ {ชื่อสตริงคอมพิวเตอร์สาธารณะ (ชื่อสตริง) {super (); this.name = name;} โมฆะสาธารณะ rungame () {system.out.println (ชื่อ+ คลาสสแตติกคลาสคอมพิวเตอร์ 1 {ชื่อสตริง; คอมพิวเตอร์สาธารณะ 1 (ชื่อสตริง) {super (); this.name = name;} โมฆะสาธารณะ rungame () {system.out.println (ชื่อ+"run game"); system.out.println (person.age.age1+"" person.name1+ {super (); this.name = name;} public void rungame () {system.out.println (ชื่อ+"run game"); system.out.println (person.his.age+""+person.this.name+"เล่นเกม"); rungame ();} ของเล่นคลาสสาธารณะ {โมฆะสาธารณะกระโดด () {system.out.println ("กระโดดของเล่น");}}สรุป
ข้างต้นเป็นคำอธิบายโดยละเอียดทั้งหมดของรหัสทดสอบภายใน Java ในบทความนี้ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!