مشخصات مقاله
آموزش 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> |