آشنایی با کلاسها و متدهای final در جاوا
در این آموزش قصد داریم تا در رابطه با کلید واژه final یا final_modifier در جاوا صحبت کنیم. این کلیدواژه را می توان به کلاس ها، متدها و متغیرها اعمال کرد، که در این آموزش در رابطه با کلاس ها و متدها صحبت می کنیم و در آموزشی جداگانه درباره اعمال کلیدواژه final به متغیرها صحبت می کنیم. در واقع final به معنی تغییر ناپذیر و نهایی هست و در ادامه این تغییر ناپذیری را دربارهی کلاس ها و متدها مورد بررسی قرار می دهیم.
کلاس های final
وقتی که یک کلاس را به صورت final تعریف می کنیم، در واقع امکان ارث بری(inheritance) را برای این کلاس از بین میبریم و هیچ کلاسی نمی تواند از کلاس تعریف شده به صورت final، ارث بری کند. مثال زیر را در نظر بگیرید :
public final class Parent { public static final void parentMethod() {} } class Child extends Parent{ }
اگر قطعه کد بالا را کامپایل کنیم، با خطایی به صورت زیر مواجه میشویم :
خطای بالا به این مفهوم میباشد که کلاس Parent به صورت final تعریف شده و در نتیجه کلاس Child نمیتواند از کلاس Parent ارث بری کند.
یکی از مهم ترین کلاس هایی که در جاوا به صورت final تعریف شده است کلاس String می باشد و با توجه به توضیحات گفته شده، هیچ کلاس نمی تواند از کلاس String ارث بری کند.
پس به طور خلاصه میتوان گفت که : هنگامی که کلاسی به صورت final تعریف میشود، قابلیت ارثبری را از دست میدهد و هیچ کلاسی نمی تواند از آن ارثبری کند، یا به عبارت دیگر کلاس final قابل گسترش نیست.
متدهای final
در مفهوم inheritance (ارث بری) به صورت پیشفرض در کلاس فرزند می توان به متدهای کلاس والد دسترسی داشت و از آن متدها استفاده کرد، برای درک بهتر مثال زیر را در نظر بگیرید :
public class Parent { public void parentMethod() { System.out.println("parent method"); } } class Child extends Parent{ public void childMethod() { parentMethod(); } }
در این قطعه کد در کلاس Parent متدی به اسم parentMethod وجود دارد و کلاس Child هم از کلاس Parent ارثبری کرده است، پس به صورت پیشفرض کلاس Child به متدهای کلاس Parent دسترسی دارد و در قطعه کد بالا هم متد childMethod از متد parentMethod مربوط به کلاس والد استفاده کرده است.
حال کلاس فرزند علاوه بر دسترسی به متدهای کلاس والد، به صورت پیشفرض این امکان را دارد که متدهای کلاس والد را مطابق نیاز خود تغییر دهد و اصطلاحا آن ها را بازنویسی (override) کند، مثال زیر را در نظر بگیرید :
public class Parent { public void parentMethod() { System.out.println("parent method"); } } class Child extends Parent{ @Override public void parentMethod() { System.out.println("parent method overriden"); } }
در قطعه کد بالا کلاس Child از کلاس Parent ارثبری کرده و همچنین متد parentMethod مربوط به کلاس Parent را بازنویسی کرده است. اما گاهی اوقات بنابرنیاز ممکن است کلاس والد به کلاس فرزند اجازه بازنویسی متدها را ندهد که برای این منظور متدها در کلاس والد به صورت final تعریف می شوند.
تعریف: هنگامی که متدی به صورت final تعریف می شود، کلاس فرزند اجازه بازنویسی(override) این متد را ندارد.
public class Parent { public final void parentMethod() { System.out.println("parent method"); } } class Child extends Parent{ @Override public void parentMethod() { System.out.println("parent method overriden"); } }
در این قطعه کد متد parentMethod به صورت final تعریف شده است و در کلاس فرزند (Child) این متد بازنویسی شده است، بنابراین با خطای کامپایلی به صورت زیر روبه رو می شویم :
مهمترین مزیت و ویژگی استفاده از کلیدواژه final یا final_modifier مربوط به امنیت (Security) می باشد، به این علت که در پیادهسازی صورت گرفته هیچ گونه تغییری اعمال نمی شود و مهمترین مشکل و عیب آن نیز این می باشد که استفاده از قدرت شی گرایی را از دست خواهیم داد. وقتی که کلاس را final تعریف می کنیم در واقع استفاده از ویژگی های ارثبری را از دست داده و هنگامی که متد را به صورت final تعریف می کنیم دیگر نمی توان از مفهوم override استفاده کرد یا به عبارت دیگر استفاده از polymorphism را از دست می دهیم.
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.