เมื่อเร็ว ๆ นี้ฉันใช้ Think in Java ฉันดูเมื่อฉันเลิกงาน ฉันรู้สึกว่ามันแตกต่างจากครั้งแรกที่ฉันดูมัน มาพูดคุยเกี่ยวกับความสัมพันธ์ระหว่างวัตถุและการอ้างอิงใน Java รวมถึงแนวคิดของชั้นเรียนภายใน
1. ทุกอย่างในชวาเป็นวัตถุ
วัตถุโอเปอเรเตอร์ใน Java คืออะไร? คำตอบคือคำพูดซึ่งเป็นเหมือนตัวชี้ใน C หรือ C ++
หากคุณมีข้อมูลอ้างอิงคุณต้องเชื่อมโยงกับวัตถุในเวลานี้มิฉะนั้นการอ้างอิงจะไม่ถูกปล่อยให้อยู่ในการควบคุมของคุณตามที่คุณคิด ตัวอย่างเช่นคุณสร้างการอ้างอิงสตริง:
สตริง s;
มันไม่เกี่ยวข้องกับวัตถุใด ๆ ในเวลานี้ หากคุณดำเนินการบางอย่างในเวลานี้เช่นการเรียกใช้วิธีการบางอย่างของสตริงจะมีปัญหาอย่างแน่นอน (ยกเว้นบางประเภทพื้นฐานเพราะเมื่อคุณกำหนดพวกเขาจะได้รับมอบหมายให้เป็นค่าเริ่มต้น) ดังนั้นคุณต้องเชื่อมโยงเงินกับวัตถุเมื่อใช้:
สตริง s = สตริงใหม่ ();
หรือ
String S =“ ฉันชื่อ Ajun”;
แค่ทำแบบนี้
2. วิธีการเชื่อมโยงกับวัตถุ
ใน Java วัตถุมักถูกสร้างขึ้นผ่านสิ่งใหม่เพื่อเชื่อมโยงกับการอ้างอิงเช่น:
สตริง s = สตริงใหม่ ("ชื่อของฉันคือ Ajun"); สิ่งนี้ไม่เพียง แต่สร้างวัตถุเพื่อเชื่อมโยงการอ้างอิง S แต่ยังเริ่มต้นสำหรับเพื่อนร่วมงาน แต่ยังสร้างประเภทวัตถุของเราเอง
3. สถานที่จัดเก็บ
(1) สแต็ค: โดยทั่วไปการอ้างอิงสแต็กเก็บและตัวแปรประเภทพื้นฐาน สแต็กส่วนใหญ่จัดสรรและปล่อยหน่วยความจำโดยการเลื่อนตัวชี้สแต็กขึ้นและลง
ตัวแปรประเภทพื้นฐานไม่เหมาะสำหรับการสร้างใหม่เพราะมีหน่วยความจำน้อยลง
(2) ฮีป: ใช้ในการจัดเก็บวัตถุจาวา เมื่อโปรแกรมดำเนินการใหม่กองจะจัดสรรพื้นที่ให้กับวัตถุนี้ โปรดจำไว้ว่ากองใช้เวลามากขึ้นในการจัดสรรและปล่อยหน่วยความจำมากกว่าสแต็กสำหรับการจัดเก็บและปล่อยหน่วยความจำ นี่คือเหตุผลที่ต้องเก็บตัวแปรประเภทพื้นฐานไว้บนสแต็กเนื่องจากตัวแปรประเภทพื้นฐานถูกใช้บ่อยที่สุดจัดเก็บและปล่อยหน่วยความจำบ่อยครั้งและเมื่อบริโภคมากขึ้นประสิทธิภาพสามารถจินตนาการได้
4. ชั้นเรียนภายใน
(1) ความรู้พื้นฐานเกี่ยวกับหมวดหมู่ภายใน:
โดยทั่วไปคลาสที่กำหนดไว้ในคลาส Java กลายเป็นคลาสภายในสามารถแบ่งออกเป็น: คลาสที่กำหนดไว้นอกร่างกายวิธีการคลาสที่กำหนดไว้ในวิธีการและคลาสภายในแบบคงที่ (กำหนดไว้นอกวิธีการเท่านั้น), คลาสภายในที่ไม่ระบุชื่อ: คำอธิบาย: คำอธิบาย:
กำหนดคลาสนอกวิธี:
ตัวแปรสมาชิกของคลาส (แบบคงที่ไม่คงที่) สามารถเข้าถึงได้ เพื่อให้แน่ใจว่าตัวแปรสมาชิกของคลาสสามารถอ้างอิงได้อย่างถูกต้องคุณต้องทำอินสแตนซ์วัตถุของคลาสภายนอกก่อนที่จะสร้างการอนุญาตการเข้าถึงวัตถุของคลาสภายใน คุณสามารถถือว่ามันเป็นตัวแปรสมาชิกของชั้นเรียนดังนั้นคุณจะเข้าใจมันมากขึ้น
ชั้นเรียนที่กำหนดไว้ในร่างกายของวิธีการ;
ตัวแปรสมาชิกของคลาส (แบบคงที่ไม่คงที่) สามารถเข้าถึงได้ เพื่อให้แน่ใจว่าตัวแปรสมาชิกของคลาสสามารถอ้างอิงได้อย่างถูกต้องคุณต้องยกตัวอย่างวัตถุของคลาสภายนอกก่อนที่จะสร้างอินสแตนซ์วัตถุของคลาสภายในไม่สามารถมีสิทธิ์ในการเข้าถึงและเพียงแค่ถือว่าเป็นตัวแปรท้องถิ่นของวิธีการ
ชั้นในแบบคงที่:
การเข้าถึงคลาสภายในที่ไม่ระบุชื่อเท่านั้นโดยการเข้าถึงตัวแปรสมาชิกแบบคงที่ของคลาส:
ตัวแปรสมาชิกของคลาส (แบบคงที่ไม่คงที่) สามารถเข้าถึงได้ เพื่อให้แน่ใจว่าตัวแปรสมาชิกของคลาสสามารถอ้างอิงได้อย่างถูกต้องมีความจำเป็นในการสร้างอินสแตนซ์วัตถุของคลาสภายนอกก่อนที่จะสร้างอินสแตนซ์ของวัตถุของคลาสภายในไม่สามารถมีได้ (2) บทบาทของชั้นเรียนภายในสามารถซ่อนชั้นเรียนได้ดีมาก โดยทั่วไปคลาสไม่อนุญาตให้เข้าถึงการป้องกันเริ่มต้นส่วนตัว
คลาสภายในสามารถใช้การสืบทอดหลายอย่างซึ่งประกอบขึ้นสำหรับลักษณะที่ Java ไม่สามารถสืบทอดได้มากขึ้น (3) ตัวอย่าง
แพ็คเกจ com.ajun.test.innerclass.example; / ** * เนื้อหาผลไม้ * @Author Administrator * */ เนื้อหาส่วนต่อประสานสาธารณะ {ค่าสตริง (); } แพ็คเกจ com.ajun.test.innerclass.example; / ** * ปลายทางผลไม้ * @author Administrator * */ ปลายทางส่วนต่อประสานสาธารณะ {// สตริงปลายทาง readlabel (); } แพ็คเกจ com.ajun.test.innerclass.example; สินค้าระดับสาธารณะ {Private String des = "IS Ruit !!"; // วิธีการเนื้อหาคลาสส่วนตัวภายนอกใช้เนื้อหา {private String name = "Apple"+des; @Override ค่าสตริงสาธารณะ () {ชื่อคืน; }} // คลาสส่วนตัวภายนอก GDESTINATE ใช้ปลายทางปลายทาง {ฉลากสตริงส่วนตัว; GDESTINATION ส่วนตัว (ป้ายกำกับสตริง) {this.label = label; } @Override สตริงสาธารณะ readlabel () {return label; }} // คลาสที่ไม่ระบุชื่อภายในคลาสสาธารณะปลายทาง getDestination (ฉลากสตริงสุดท้าย) {ส่งคืนปลายทางใหม่ () {@Override สตริงสาธารณะ readlabel () {return label; - } ปลายทางสาธารณะปลายทาง (สตริง s) {ส่งคืน gdestination ใหม่; } เนื้อหาเนื้อหาสาธารณะ () {ส่งคืนเนื้อหาใหม่ (); } ปลายทางสาธารณะ Dest2 (String S) {Class Gdestination ใช้ปลายทาง {ฉลากสตริงส่วนตัว; GDESTINATION ส่วนตัว (ป้ายกำกับสตริง) {this.label = label; } @Override สตริงสาธารณะ readlabel () {return label; }} ส่งคืน gdestination ใหม่; }} แพ็คเกจ com.ajun.test.innerclass.example; การทดสอบระดับสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] a) {สินค้า gs = สินค้าใหม่ (); สารบัญ c = gs.content (); ปลายทาง d = gs.dest ("ปักกิ่ง"); System.out.println (C.Value ()); System.out.println (D.ReadLabel ()); ปลายทาง d1 = gs.getDestination ("เซี่ยงไฮ้"); System.out.println (d1.readlabel ()); System.out.println (gs.dest2 ("tianjin"). readlabel ()); -เนื้อหาและ gdestination ถูกซ่อนไว้อย่างดี เมื่อโทรออกไปข้างนอกคุณไม่ทราบว่ามีการเรียกคลาสใดเพื่อให้คลาสนี้มีคุณสมบัติการสืบทอดหลายอย่าง
เอาท์พุท;
แอปเปิ้ลคือ ruit !! ปักกิ่งเซี่ยงไฮ้เทียนจิน