JavaRush /وبلاگ جاوا /Random-FA /پرسش و پاسخ: آیا می توان متدهای انتزاعی را در کلاس نهایی ...

پرسش و پاسخ: آیا می توان متدهای انتزاعی را در کلاس نهایی تعریف کرد؟

در گروه منتشر شد
این سوال جالب و مهم از یکی از خوانندگان من در طی یک مصاحبه تلفنی برای سمت توسعه دهنده جاوا پرسیده شد. اگرچه او می‌دانست که ساختن یک کلاس انتزاعی finalدر زبان جاوا غیرممکن است ، اما با عبارت سوال گیج شده بود. پاسخ ساده است: نه، finalنمی‌توان روش‌های انتزاعی در یک کلاس وجود داشت. چرا؟ چون به محض اینکه یک متد انتزاعی را در کلاس زبان جاوا اعلان کنید، این کلاس به طور خودکار انتزاعی می شود و finalنمی توانید یک کلاس انتزاعی در زبان جاوا بسازید. finalاین بدان معناست که نمی‌توان متدهای انتزاعی در کلاس جاوا وجود داشت.
پرسش و پاسخ: آیا می توان متدهای انتزاعی را در کلاس نهایی تعریف کرد؟  - 1
بسیاری از توسعه دهندگان جاوا هنگام پاسخ دادن به این سوال به دلیل جمله بندی گیج می شوند. حتی اگر سوال پرسیده شده با مفهوم کلی آشنا باشد، ممکن است متوجه نشود که یک کلاس، پس از اعلام یک متد انتزاعی در آن، انتزاعی می شود و شما finalنمی توانید یک کلاس انتزاعی در جاوا بسازید. این نکته این سؤال را از سؤال رایج تر و متداول تر جدا می کند: آیا در جاوا امکان دارد یک کلاس را به طور همزمان انتزاعی و نهایی اعلام کنیم؟ بیایید به یک کد مثال نگاه کنیم تا نشان دهیم که finalنمی توان یک متد انتزاعی را در یک کلاس - اعلام کرد. اجازه دهید کلاسی به نام Hello.javaداشته باشیم که متد انتزاعی دارد . public finalHelloprint()
public final class Hello {
  public abstract void print();
}
این کد را در IDE تایپ کنید، پیغام خطای زیر را دریافت می کنید، می گویند Helloباید یک کلاس انتزاعی باشد تا بتوان متدهای انتزاعی را در آن اعلان کرد.
پرسش و پاسخ: آیا می توان متدهای انتزاعی را در کلاس نهایی تعریف کرد؟  - 2
پرسش و پاسخ: آیا می توان متدهای انتزاعی را در کلاس نهایی تعریف کرد؟  - 3
اگر این کد را در Notepad تایپ کرده و با استفاده از ابزار جاواک از خط فرمان کامپایل کنید، همین اتفاق می افتد. با توجه به مشخصات جاوا، به محض اینکه یک متد انتزاعی را در یک کلاس اعلام کنید، آن کلاس به یک کلاس انتزاعی تبدیل می شود و از آنجایی که نمی توانید finalیک کلاس انتزاعی در جاوا بسازید، کامپایلر یک خطا ایجاد می کند. این برای کلاس های سطح بالا و کلاس های تودرتو در زبان جاوا صادق است. حتی اگر یک متد انتزاعی را در یک کلاس تودرتو اعلام کنید final، خطا یکسان خواهد بود. سوال مرتبط دیگر این است: آیا یک کلاس انتزاعی در جاوا می تواند متدهای ثابت داشته باشد؟ پاسخ: بله، آنها می توانند، اعلان یک متد استاتیک در یک کلاس انتزاعی مشکلی ندارد، زیرا برای استفاده از یک متد استاتیک نیازی به ایجاد نمونه ای از کلاس نیست، می توان آنها را به سادگی با استفاده از نام کلاس فراخوانی کرد. می‌توانیم مثال خود را طوری تغییر دهیم که Helloمتدی را در کلاس قرار دهد main()که در جاوا ثابت است، همانطور که در زیر نشان داده شده است:
public abstract class Hello {
  public abstract void print();
  public static void main(String args[]) {
     // Howой-то code
  }
}
همانطور که می بینید، هیچ خطای کامپایل پرتاب نمی شود. این کد بدون مشکل کامپایل می شود، زیرا در جاوا می توانید با خیال راحت یک متد استاتیک را در یک کلاس انتزاعی اعلام کنید. نتیجه گیری مختصر نمی توان یک روش انتزاعی را در یک finalکلاس اعلام کرد. زیرا با انجام این کار، کلاس به طور خودکار با توجه به مشخصات جاوا انتزاعی می شود. و از آنجایی که finalیک کلاس در جاوا نمی تواند انتزاعی باشد، این غیر قابل قبول است و کامپایلر با پرتاب خطا شما را از انجام این کار منع می کند. اما شما می توانید متدهای استاتیک را هم در کلاس های نهایی و هم در کلاس های انتزاعی اعلام کنید، هیچ مشکلی در این مورد وجود ندارد.
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION