یه تابستون متفاوت با یه تصمیم هوشمندانه! دوره هوش مصنوعی یه تابستون متفاوت با یه تصمیم هوشمندانه! دوره هوش مصنوعی
🎯 ثبت نام

آموزش Java – member inner class/کلاس تعریف شده در سطح کلاس دیگر در Java

آموزش Java – member inner class/کلاس تعریف شده در سطح کلاس دیگر در Java

به کلاس غیر static که در سطح کلاس دیگر اما خارج از بدنه ی متد عضو آن تعریف شده باشد در اصطلاح member inner class گویند.

در زیر نحوه ی تعریف این کلاس را مشاهده کنید:

1
2
3
4
5
6
7
class Outer { 
 //code 
 class Inner{ 
  //code 
 
<button></button>

مثال کاربردی از member inner class

در این مثال، یک متد به نام msg() در سطح کلاس member inner class تعریف کرده ایم که به متغیر عضو private کلاس میزبان (فیلد data) دسترسی داشته و مقدار آن را در خروجی چاپ می کند.

1
2
3
4
5
6
7
8
9
10
11
12
class TestMemberOuter1{ 
 private int data=30; 
 class Inner{ 
  void msg(){System.out.println("data is "+data);} 
 
 public static void main(String args[]){ 
  TestMemberOuter1 obj=new TestMemberOuter1(); 
  TestMemberOuter1.Inner in=obj.new Inner(); 
  in.msg(); 
 
<button></button>

خروجی:

1
data is 30<button></button>

جزئیات داخلی عملکرد member inner class در جاوا

کامپایلر جاوا برای کلاس نام برده دو (فایل حاوی کد ترجمه شده به زبان میانی bytecode که بر روی jvm اجرا می شود) class file ایجاد کرده و class file مربوط به inner class را "Outer$Inner" نام گذاری می کند. به منظور ایجاد نمونه از روی (کلاسی که داخل کلاس دیگر تعریف شده) inner class، لازم است ابتدا نمونه ی کلاس میزبان (outer class) را ایجاد نمایید. در چنین شرایطی نمونه ی inner class داخل نمونه ی کلاس میزبان (outer class) ساخته می شود.

کد داخلی که خروجی کامپایلر می باشد

همان طور که در بالا گفته شد، کامپایلر جاوا یک class file به نام Outer$Inner ویژه ی inner class تولید می کند. این کلاس داخلی، اشاره گری (reference) به کلاس میزبان داشته (به آدرس آبجکت ساخته شده از روی کلاس میزبان در حافظه دسترسی داشته) و به همین دلیل می تواند به اعضای داده ای آن حتی فیلدهای private به راحتی دسترسی داشته باشد.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.io.PrintStream; 
class Outer$Inner 
final Outer this$0
Outer$Inner() 
{   super(); 
this$0 = Outer.this; 
void msg() 
System.out.println((new StringBuilder()).append("data is "
.append(Outer.access$000(Outer.this)).toString()); 
<button></button>
1396/08/03 2901 1397
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

نظرات خود را ثبت کنید...