Inner Class ใน Java คืออะไร?
เผยแพร่แล้ว: 2022-04-29แนวคิดของ inner class ใน Java เป็นพื้นฐานของการเขียนโปรแกรม Java ใน Java คลาสที่ซ้อนกันและคลาสภายในเป็นแนวคิดที่คล้ายกันมากแต่แตกต่างกันเล็กน้อยในการออกแบบคลาสและมักจะไปพร้อมกัน
คลาสที่ซ้อนกันถูกกำหนดไว้ภายในคลาสอื่นและมีสองประเภท - คลาสที่ซ้อนกันแบบสแตติกและคลาสที่ซ้อนกันแบบไม่คงที่ ในทางกลับกัน คลาสภายในเป็นประเภทของคลาสที่ซ้อนกันแบบ non-static และยังมีอีกสามประเภท – คลาสสมาชิกภายใน คลาสภายในที่ไม่ระบุชื่อ และคลาสภายในภายใน
ดังนั้นคลาสภายในทั้งสามประเภทนี้หมายถึงอะไรและมีประโยชน์อย่างไร? อ่านต่อไปเพื่อค้นหาคำแนะนำโดยละเอียดเกี่ยวกับ Java inner class
ความหมายของชั้นในในภาษาชวา
คลาสที่ซ้อนกันแบบไม่คงที่หรือคลาสภายในถูกกำหนดไว้ภายในคลาสอื่น และสามารถเข้าถึงสมาชิกของคลาสภายนอก (คลาสที่ล้อมรอบ) ในทางตรงกันข้าม คลาสที่ซ้อนกันแบบสแตติกยังเป็นคลาสที่กำหนดไว้ภายในคลาสอื่นด้วย แต่ไม่เหมือนกับคลาสที่ซ้อนกันแบบสแตติก มันไม่สามารถเข้าถึงตัวแปรสมาชิกของคลาสภายนอกได้ ในกรณีของคลาสที่ซ้อนกันแบบ non-static เราไม่จำเป็นต้องสร้างอินสแตนซ์ของคลาสภายนอก แต่ในกรณีของชั้นใน เราต้องยกตัวอย่างชั้นนอกก่อนจึงจะสามารถยกตัวอย่างชั้นในได้
แหล่งที่มา
ประเภทของชั้นในใน Java
ใน Java คลาสภายในมีสามประเภทต่อไปนี้:
- สมาชิกชั้นใน
- ชั้นในนิรนาม
- ชั้นในของท้องถิ่น
ตอนนี้ ให้เราเข้าใจแต่ละประเภทของชั้นในด้วยตัวอย่าง
1. สมาชิกชั้นใน
คลาสภายในของสมาชิกใน Java เป็นคลาสที่ซ้อนกันแบบไม่คงที่ที่สร้างขึ้นภายในคลาส แต่อยู่นอกเมธอด เรียกอีกอย่างว่า inner class ปกติ สมาชิก inner class สามารถประกาศได้ด้วย access modifiers เช่น private, public, default และ protected
ไวยากรณ์สำหรับคลาสภายในของสมาชิกมีดังนี้:
ชั้นนอก{
//รหัส
ชั้นใน{
//รหัส
}
}
สมาชิกชั้นในในตัวอย่าง Java:
รับด้านล่างเป็นโปรแกรมเพื่อสาธิตวิธีสร้างคลาสภายในและเข้าถึง เราจะทำให้คลาสภายในเป็นส่วนตัวและใช้วิธี display_Inner() เพื่อเข้าถึงคลาส
คลาส DemoOuter {
จำนวนเต็ม;
//ชั้นใน
DemoInner คลาสส่วนตัว {
พิมพ์โมฆะสาธารณะ () {
System.out.println("นี่คือชั้นใน");
}
}
// เข้าถึง inner class จาก method within
เป็นโมฆะ display_Inner () {
ภายใน DemoInner = ใหม่ DemoInner ();
inner.print();
}
}
MyClass คลาสสาธารณะ {
โมฆะคงที่สาธารณะหลัก (สตริง args []) {
// ยกตัวอย่างชั้นนอก
DemoOuter ด้านนอก = DemoOuter ใหม่ ();
// การเข้าถึงเมธอด display_Inner()
outer.display_Inner();
}
}
ผลลัพธ์: นี่คือคลาสชั้นใน
ในตัวอย่างข้างต้น OuterDemo คือคลาสภายนอก InnerDemo คือคลาสภายใน เรากำลังสร้างอินสแตนซ์ของคลาสภายในภายในเมธอด display_Inner() ซึ่งเรียกใช้จากเมธอดหลัก
สำรวจหลักสูตรวิศวกรรมซอฟต์แวร์ยอดนิยมของเรา
เอสแอล. ไม่ | โปรแกรมพัฒนาซอฟต์แวร์ | |
1 | วิทยาศาสตรมหาบัณฑิตสาขาวิทยาการคอมพิวเตอร์จาก LJMU & IIITB | โปรแกรมใบรับรองความปลอดภัยทางไซเบอร์ของ Caltech CTME |
2 | Bootcamp การพัฒนาเต็มกอง | โปรแกรม PG ใน Blockchain |
3 | Executive Post Graduate Program in Software Development - Specialization in DevOps | ดูหลักสูตรวิศวกรรมซอฟต์แวร์ทั้งหมด |
2. ชั้นในนิรนาม
คลาสภายในที่ไม่ระบุชื่อใน Java เป็นคลาสภายในที่ประกาศโดยไม่มีชื่อคลาสใด ๆ และสำหรับการสร้างอ็อบเจ็กต์เดียวเท่านั้น คลาสภายในที่ไม่ระบุชื่อใน Java ถูกประกาศและสร้างอินสแตนซ์ในเวลาเดียวกัน สิ่งเหล่านี้มีค่าที่สุดเมื่อเราต้องการแทนที่เมธอดของคลาสหรืออินเตอร์เฟส
ไวยากรณ์สำหรับคลาสภายในที่ไม่ระบุชื่อใน Java มีดังนี้:
AnonymousInner an_inner = ใหม่ AnonymousInner () {
โมฆะสาธารณะ my_method() {
//รหัส
}
};
คลาสภายในที่ไม่ระบุชื่อใน Java สามารถสร้างได้สองวิธี:
- ใช้คลาส
- การใช้อินเทอร์เฟซ
คลาสภายในที่ไม่ระบุชื่อในตัวอย่าง Java (โดยใช้คลาส):
อาหารระดับนามธรรม{
นามธรรมเป็นโมฆะกิน ();
}
คลาส TestAnonymousInner{
โมฆะคงที่สาธารณะหลัก (สตริง args[]){
มื้อ m=มื้อใหม่(){
โมฆะกิน (){System.out.println("Bon appetit!");}
};
เนื้อ();
}
}
ผลลัพธ์: อร่อยดี!
คลาสภายในที่ไม่ระบุชื่อในตัวอย่าง Java (โดยใช้อินเทอร์เฟซ):
เกมอินเทอร์เฟซ{
การเล่นเป็นโมฆะ ();
}
คลาส TestAnnoonymousInner1{
โมฆะคงที่สาธารณะหลัก (สตริง args[]){
เกม g = เกมใหม่ (){
การเล่นเป็นโมฆะสาธารณะ(){System.out.println("เกมกลางแจ้ง");}
};
g.play();
}
}
เอาท์พุต: เกมกลางแจ้ง
3. ชั้นในของท้องถิ่น
คลาสภายในท้องถิ่นใน Java เป็นคลาสที่สร้างขึ้นภายในเมธอด ในกรณีของตัวแปรโลคัล ขอบเขตของคลาสภายในโลคัลยังคงถูกจำกัดภายในเมธอด
คลาสภายในโลคัลถูกกำหนดไว้ภายในบล็อก: เนื้อหาของเมธอด, if clause หรือ for loop คลาสภายในท้องถิ่นไม่ได้เป็นสมาชิกของคลาสที่ปิดล้อมใด ๆ แต่เป็นของบล็อกภายในที่กำหนด ดังนั้น แม้ว่าคลาสภายในโลคัลใน Java จะไม่สามารถมีตัวแก้ไขการเข้าถึงที่เชื่อมโยงอยู่ได้ คุณสามารถทำเครื่องหมายว่าเป็นนามธรรมหรือขั้นสุดท้ายได้ ถ้าเราต้องการเรียกใช้ method ของ local inner class เราต้องสร้าง class ภายใน method
คลาสภายในท้องถิ่นในตัวอย่าง Java:
ด้านล่างนี้คือโปรแกรมตัวอย่างเพื่อสาธิตวิธีการยกตัวอย่างอ็อบเจ็กต์ของคลาสภายในภายในที่ประกาศภายในเมธอดของคลาสภายนอก
แพ็คเกจ innerClass;
คลาสสาธารณะ Outer_Class
{
// เมธอดอินสแตนซ์ของคลาส Outer_Class
การแสดงโมฆะสาธารณะ ()
{
// ประกาศเมธอดภายในคลาสภายใน
คลาส Inner_Class
{
โมฆะสาธารณะ msg(){
System.out.println(“นี่คือคลาสภายในท้องถิ่น!”);
}
}
// สร้างอินสแตนซ์ของเมธอดภายในคลาสและเรียกใช้เมธอด msg() โดยใช้ตัวแปรอ้างอิงอ็อบเจ็กต์ i
Inner_Class i = ใหม่ Inner_Class();
i.msg();
}
โมฆะคงที่สาธารณะ main(String[] args)
{
// สร้างวัตถุของคลาสภายนอก Outer_Class
Outer_Class o = ใหม่ Outer_Class ();
o.display();
}
}
ผลลัพธ์: นี่คือคลาสภายในท้องถิ่น!
ด้วยพื้นฐานของ Java inner class ให้เราเข้าใจว่าทำไมเราถึงต้องการมันตั้งแต่แรก
ข้อดีของ Java Inner Class
คลาสภายในใน Java นำสามยูทิลิตี้ที่สำคัญมาสู่ตาราง เหล่านี้มีดังนี้:
1. เนื่องจาก Java inner class สามารถเข้าถึงข้อมูลสมาชิกและ method ของ outer/main class รวมถึง private จึงแสดงถึงความสัมพันธ์เฉพาะประเภท
2. คลาสภายในของ Java ลดการเข้ารหัสลงอย่างมากเนื่องจากต้องการการเขียนน้อยกว่า
3. คลาสภายในใน Java จะจัดกลุ่มคลาสและอินเทอร์เฟซอย่างมีเหตุผลในที่เดียว ดังนั้นจึงช่วยเพิ่มความสามารถในการอ่านโค้ดและทำให้ง่ายต่อการบำรุงรักษา
สรุป
แนวคิดของคลาสที่ซ้อนกันทำให้ง่ายขึ้นและเพิ่มความยืดหยุ่นในการสร้างคลาสได้ทุกที่ในการเขียนโปรแกรม Java ในเรื่องนี้คลาสที่ซ้อนกันแบบ non-static ที่รู้จักกันในชื่อ inner class นั้นมีประโยชน์อย่างยิ่ง ดังที่เราได้เห็นในการสนทนาของเราแล้ว
เราต้องการสรุปโดยระบุสองกรณีที่การใช้ inner class ดูเหมาะสมที่สุด ประการแรก คลาสภายในของ Java นั้นเหมาะสมที่สุดเมื่อสองคลาสมีความสัมพันธ์ใกล้ชิดและคลาสอื่นไม่สามารถเข้าถึงได้ และประการที่สอง คลาสภายในเป็นเรื่องธรรมดาในการจัดการเหตุการณ์การเขียนโปรแกรม Java GUI ดังนั้น คลาสภายในของ Java สามารถใช้ได้อย่างปลอดภัยเมื่อผู้ฟังและส่วนประกอบ GUI เกี่ยวข้อง
สงสัยว่าจะเรียน Java ที่ไหน?
การรับรอง PG ที่เชื่อมโยงกับงานของ upGrad ในสาขาวิศวกรรมซอฟต์แวร์ คือสิ่งที่คุณกำลังมองหา!
การรับรอง PG ที่เชื่อมโยงกับงานของ upGrad ในสาขาวิศวกรรมซอฟต์แวร์ ได้รับการออกแบบมาเป็นพิเศษสำหรับนักศึกษาจบใหม่และปีสุดท้าย ซึ่ง เหมาะอย่างยิ่งสำหรับผู้ที่ต้องการเรียนรู้การเขียนโปรแกรมและรับตำแหน่งในบทบาทซอฟต์แวร์ระดับเริ่มต้น โปรแกรมออนไลน์ 5 เดือนนี้จะสอนทักษะซอฟต์แวร์ชั้นนำ เช่น Java, JavaScript, HTML5, DSA, AWS, MERN และอีกมากมาย!
จุดเด่นของโปรแกรม:
- ความเชี่ยวชาญใน MERN Stack/Cloud-Native
- การเรียนรู้ออนไลน์มากกว่า 500 ชั่วโมง
- การฝึกปฏิบัติจริงมากกว่า 350 ชั่วโมง
- 50+ เซสชันสด
- ห้าโครงการอุตสาหกรรม
- การสร้างเครือข่ายกับผู้เชี่ยวชาญในอุตสาหกรรม
- ฟอรัมถาม & ตอบกับเพื่อนและผู้เชี่ยวชาญในอุตสาหกรรม
- การสนับสนุนการเรียนรู้จากผู้ช่วยสอนและพี่เลี้ยงในอุตสาหกรรม
ลงทะเบียนวันนี้ เพื่อเรียนรู้จากผู้เชี่ยวชาญในอุตสาหกรรมนี้!
ความแตกต่างระหว่างคลาสภายในและคลาสย่อยคืออะไร?
คลาสชั้นในคือคลาสที่ซ้อนกันหรือกำหนดไว้ภายในคลาสอื่น ในทางกลับกัน คลาสย่อยคือคลาสที่มาจากคลาสอื่น ยิ่งกว่านั้น ในขณะที่คลาสภายในสามารถเข้าถึงได้โดยใช้การอ้างอิงของคลาสภายนอกที่ซ้อนกันอยู่ คลาสย่อยสามารถเข้าถึงได้โดยตรง เว้นแต่ว่าคลาสย่อยนั้นได้รับตัวแปรไพรเวต
เราสามารถเขียนคลาสในคลาสใน Java ได้หรือไม่?
ใช่ เราสามารถกำหนดคลาสภายในคลาสอื่นใน Java คลาสดังกล่าวเรียกว่าคลาสที่ซ้อนกัน และช่วยให้เราสามารถจัดระเบียบคลาสตามตรรกะในที่เดียว ดังนั้นจึงสร้างโค้ดที่สามารถบำรุงรักษาและอ่านได้มากขึ้น ในฐานะที่เป็นส่วนหนึ่งของคลาสที่ปิดล้อม คลาสที่ซ้อนกันสามารถประกาศให้เป็นสาธารณะ ส่วนตัว แพ็คเกจส่วนตัว หรือได้รับการคุ้มครอง
Java inner class สามารถเป็นแบบส่วนตัวได้หรือไม่?
ใช่ คลาสภายในของ Java สามารถเป็นแบบส่วนตัวได้ แต่เมื่อประกาศคลาสภายในเป็นส่วนตัว จะไม่สามารถเข้าถึงได้จากวัตถุที่อยู่นอกคลาส คลาสภายในและภายนอกสามารถเข้าถึงตัวแปรอินสแตนซ์ส่วนตัวและเมธอดส่วนตัวของกันและกัน ตราบใดที่เราอยู่ภายในคลาสชั้นนอกหรือชั้นใน ตัวดัดแปลงแบบส่วนตัวและแบบสาธารณะก็มีผลเช่นเดียวกัน