آموزش قدم به قدم جاوا – قسمت بیستم

کلاس‌های تو در تو (Nested Classes)

تا به حال کلاس‌هایی که می‌نوشتیم همگی در یک فایل با فرمت .java ذخیره می‌شدند که نام فایل برابر با نام کلاس بود. اما یکی از قابلیت‌های زبان جاوا امکان تعریف یک کلاس درون کلاس دیگر است. به این کلاس‌ها، کلاس‌های تو در تو گفته می‌شود.

کلاس‌های تو در تو به دو دسته تقسیم می‌شوند: کلاس‌های داخلی (Inner Classes) و کلاس‌های تو در تو استاتیک (Static Nested Classes)

همچنین دو نوع کلاس دیگر به نام‌های کلاس‌های محلی (Local Classes) و کلاس‌های ناشناس (Anonymous Classes) وجود دارند که البته زیر شاخه کلاس‌های داخلی محسوب می‌شوند.

اگر کلاسی فقط مورد استفاده یک کلاس دیگر قرار می‌گیرد بهتر است به جای تعریف آن کلاس در یک فایل جداگانه آن را درون کلاسی که می‌خواهد از آن استفاده کند تعریف کنیم. با این کار اصل کپسوله‌سازی در برنامه بیشتر رعایت می‌شود.

کلاس‌های داخلی (Inner Classes)

کلاس‌های داخلی می‌توانند به صورت مستقیم به اعضای کلاس دربردارنده خود دسترسی داشته باشند. تنها در صورتی می‌توان از این کلاس‌ها شی ساخت که یک شی از کلاس دربردارنده آن وجود داشته باشد.

مثال:

همانطور که می‌بینید کلاس Engine درون کلاس Car تعریف شده است و یک متد به نام start دارد. در دستور چاپ که در متد start وجود دارد از فیلد name استفاده کردیم. همانطور که گفتیم کلاس داخلی می‌تواند به اعضای کلاس دربردارنده خود دسترسی داشته باشد.

حال در کلاسی که متد main در آن قرار دارد به صورت زیر ابتدا یک شی از کلاس Car ساخته و سپس از طریق آن یک شی از کلاس Engine می‌سازیم و متد start آن را فراخوانی می‌کنیم:

اگر به خط زیر دقت کنید با شکل کلی ساخت یک شی از یک کلاس داخلی آشنا خواهید شد:

همانطور که مشخص است توسط شی myCar که از کلاس Car موجود است توانستیم یک شی به نام myCarEngine از کلاس Engine بسازیم.

نکته دیگر این که ما کلاس Engine را به صورت public در کلاس Car تعریف کردیم. اگر کلاس Engine را با تعیین‌کننده دسترسی private تعریف می‌کردیم فقط می‌توانستیم در همان کلاس Car از آن استفاده کنیم. یا اگر بدون تعیین‌کننده دسترسی یا package-private تعریف می‌کردیم فقط کلاس‌هایی می‌توانستند از کلاس Engine استفاده کنند که در پکیجی که کلاس Car در آن وجود دارد باشند.

کلاس‌های تو در تو استاتیک (Static Nested Classes)

کلاس‌های تو در توی استاتیک مستقل از کلاس دربردارنده خود هستند. مستقل به این معنا که برای ایجاد شی از یک کلاس تو در توی استاتیک نیازی به وجود شی از کلاس دربردارنده آن نیست.

مثال:

حال به صورت زیر یک شی از کلاس Engine ساخته و متد start آن را فراخوانی می‌کنیم:

از آنجایی که برای ایجاد شی از یک کلاس تو در توی استاتیک نیازی به وجود شی از کلاس دربردارنده آن نیست، بنابراین کلاس‌های تو در توی استاتیک نمی‌توانند به اعضای کلاس دربردارنده خود دسترسی داشته باشند. چون شیئی از کلاس دربردارنده آن وجود ندارد که بخواهیم از طریق آن به اعضای آن دسترسی پیدا کنیم. (مگر اعضایی که به صورت استاتیک تعریف شده باشند)

کلاس‌های محلی (Local Classes)

کلاس‌های محلی کلاس‌هایی هستند که در بلاک‌ها (متدها، سازنده‌ها، حلقه‌ها، دستورات شرطی و…) تعریف می‌شوند و به اعضای کلاسی که درون آن تعریف شده‌اند دسترسی دارند.

نکته مهم این که کلاس‌های محلی فقط در همان بلاکی که تعریف شده‌اند قابل استفاده هستند.

مثال:

نحوه تعریف کلاس محلی و استفاده از آن در این کد کاملا مشخص است. توجه داشته باشید که برای کلاس Engine نمی‌توان تعیین‌کننده دسترسی تعریف کرد. همچنین اگر برای متد start هر تعیین‌کننده دسترسی تعریف کنید باز هم فقط و فقط این کلاس محلی در متد startEngine قابل استفاده است.

نکته: اگر یک کلاس محلی در یک متد استاتیک تعریف شده باشد فقط می‌تواند به اعضای استاتیک کلاس بیرونی خود دسترسی داشته باشد.

کلاس‌های ناشناس (Anonymous Classes)

کلاس‌های ناشناس مانند کلاس‌های محلی هستند با این تفاوت که نام ندارند. وقتی بخواهیم از یک کلاس محلی فقط یک بار استفاده کنیم می‌توانیم از کلاس‌های ناشناس استفاده کنیم.

کلاس‌های ناشناس یک خصوصیت مهم دارند و آن این است که به محض تعریف یک کلاس ناشناس یک شی از آن کلاس ساخته می‌شود پس بنابراین شما یک بار کلاس ناشناس را تعریف کرده و در همان لحظه یک شی از آن می‌سازید.

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

  1. یک اینترفیس را پیاده سازی کند.
  2. از یک کلاس مشتق شود. (ارث‌بری داشته باشد.)

مثال: فرض کنید از قبل اینترفیسی به نام Test داریم که یک متد به نام showMsg در آن وجود دارد. می‌خواهیم یک کلاس ناشناس تعریف کنیم که این اینترفیس را پیاده‌سازی کند:

همانطور که در قسمت اینترفیس‌ها گفته شد اگر متغیری از جنس یک اینترفیس تعریف کنیم باید شیئی به آن متغیر نسبت دهیم که از کلاسی ساخته شده باشد که آن اینترفیس را پیاده‌سازی کرده باشد.

در این کد یک کلاس ناشناس تعریف کردیم که اینترفیس Test را پیاده‌سازی می‌کند. همانطور که گفتیم در لحظه تعریف کلاس ناشناس یک شی از آن کلاس نیز ساخته می‌شود پس یک شی از این کلاس ناشناس ساخته شده و به متغیر t1 نسبت داده شده است.

نحوه تعریف کلاس ناشناسی که از یک کلاس دیگر ارث‌بری داشته باشد نیز به همین ترتیب است. یعنی اگر کلاسی به نام Test داشته باشیم که یک متد به نام showMsg داشته باشد باز هم مانند کد قبل یک کلاس ناشناس ایجاد می‌کنیم و متد showMsg را در آن Override می‌کنیم.

دو نکته راجع به کلاس‌های ناشناس

  1. کلاس ناشناس می‌تواند به اعضای کلاس بیرونی خود دسترسی داشته باشد.
  2. کلاس ناشناس نمی‌تواند به متغیرهای محلی موجود در بلاکی که در آن تعریف شده دسترسی داشته باشد مگر آنکه آن متغیرها به صورت final تعریف شده باشند.

مصطفی نصیری

دانشجوی نرم افزار هستم و علاقه شدیدی به برنامه نویسی مخصوصا با زبان جاوا دارم! در حال حاضر تمرکزم روی اندرویده. دوست دارم چیزایی که یاد میگیرم رو با بقیه به اشتراک بگذارم :)

همچنین ممکن است دوست داشته باشید ...

۳ واکنش

  1. حبیب گفت:

    سلام،اموزشهارو دیدم خیلی خوب بود فقط قسمت دوازدهم و که کانستراکتر بود یکمی مبهم شروع شده ،به نظرم باید اول کانستراکتور رو کامل توضیح میدادید بعد میرفتید سراغ اجرا و تغییرات
    به هرحال من اکثر ویدیو های آموزشی رو نگاه کردم ولی به این خوبی،بی نقصی ندیدم،آیا از رفرنس خاصی استفاده میکنید اگه آره لطفا بگید،اونی که بیشترین اثر رو توی دید شما به برنامه نویسی گذاشته،و بهترین آموزش فارسی جاوا هم فیلم و هم کتاب رو بیان کنید
    ممنون از وسواس بیش از حد شما درنوشتن:)

    • مصطفی نصیری گفت:

      سلام خوشحالم از اینکه مطالب رو پسندیدید.
      در مورد کانستراکتر که گفتید دوباره خوندم اون مطلب رو به نظرم توضیح بیشتری لازم نداشت اما شما اگر توضیح خاصی مد نظرتون هست که به بهتر شدن مطلب کمک می کنه خوشحال میشم با من در میون بگذارید
      در مورد رفرنس هم که گفتید من برای نوشتن این آموزش ها به غیر از برخی موارد جزئی از رفرنس خاصی استفاده نکردم و سعی کردم از دانسته های خودم بنویسم تا بتونم مطالب رو بهتر بیان کنم اما من کتاب Java: A beginner’s guide نوشته هربرت شیلد رو خیلی پسندیدم و هنوز هم برخی مطالبش رو چند وقت یک بار دوره می کنم و این کتاب به شدت مباحث رو مفهومی گفته و دلیل خط به خط کدهایی رو که نوشته توضیح داده. به شما هم توصیه می کنم این کتاب رو بخونید.
      در منابع فارسی هم به نظرم کتاب “برنامه نویسی به زبان جاوا” نوشته آقای صدیقی بهتر از بقیه کتاب های فارسی هستش. فیلم آموزشی فارسی هم متاسفانه اطلاعی ندارم.
      موفق باشید

  2. iman12313 گفت:

    فیلم های اموزشی فارسی برای جاوا یکی ازبهتریناش اموزش javacup هست سرچ کنید می بینید رایگان و عالی

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *