خرداد ۷, ۱۳۹۸ Mostafa بدون دیدگاه

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

توجه : درخواست افزونه ،قالب، اسکریپت و نرم افزار و ... و سوالات و مشکلات خود را در انجمن ارسال نمایید

کلیدواژه ی final در زبان جاوا اگر همراه متغیر بکار رود، یعنی مقدار اولیه ی آن متغیر نهایی و ثابت بوده و دیگر تغییر نخواهد کرد، اگر در خط تعریف متد قید شود، بدین معنی است که آن متد قابل بازنویسی (override) و ویرایش در کلاس فرزند نخواهد بود و رفتار متد برای همیشه ثابت می باشد. چنانچه این کلیدواژه را در تعریف کلاس بکار ببرید، آن کلاس قابلیت وراثت را از دست داده و دیگر امکان ایجاد کلاس فرزند (subclass) از آن وجود نخواهد داشت.

در زبان Java کلیدواژه ی final برای محدود کردن کاربر بکار می رود. این کلیدواژه در سه زمینه زیر قابل استفاده می باشد:

متغیر
متد
کلاس

همان طور که گفته شد می توان کلیدواژه ی final را به متغیرها اعمال کرد. متغیری که با کلیدواژه ی final علامت گذاری شده ولی مقداری به آن اختصاص نیافته است، در اصطلاح متغیر تهی غیرقابل مقداردهی/blank final variable گویند. این متغیر تنها در بدنه ی تابع سازنده (constructor) قابل مقداردهی می باشد.

متغیر فاقد مقدار final همچنین می تواند به صورت static تعریف شود. لازم به ذکر است که متغیر final و static تنها داخل بدنه ی قطعه کد static قابل مقداردهی می باشد.
متغیر final در Java

اگر توسعه دهنده متغیری را با کلیدواژه ی final علامت گذاری کند، مقدار آن متغیر برای همیشه ثابت خواهد بود (کامپایلر با آن به منزله ی یک ثابت/constant برخورد می کند).
مثال کاربردی از کلیدواژه ی final

در مثال جاری یک متغیر علامت گذاری شده با کلیدواژه ی final به نام speedlimit وجود دارد و ما قصد داریم مقدار آن را ویرایش کنیم. اما اگر به خاطر داشته باشید این امکان وجود ندارد چرا که متغیر final پس از مقداردهی اولیه، دیگر قابل ویرایش نمی باشد.

class Bike9{  
 final int speedlimit=90;//final variable  
 void run(){  
  speedlimit=400;  
 }  
 public static void main(String args[]){  
 Bike9 obj=new  Bike9();  
 obj.run();  
 }  
}//end of class

خروجی : Compile Time Error

 

همان طور که مشاهده می کنید مقدار متغیر final پس از تخصیص دیگر قابل تغییر نمی باشد. برنامه ی فوق به هنگام کامپایل خطا می دهد.
متد final در Java

اگر متدی را به صورت final تعریف نمایید، در آن صورت بدنه یا پیاده سازی آن هیچگاه قابل تغییر نمی باشد.
مثال کاربردی از متد final

class Bike{  
  final void run(){System.out.println("running");}  
}  
class Honda extends Bike{  
   void run(){System.out.println("running safely with 100kmph");}  
   public static void main(String args[]){  
   Honda honda= new Honda();  
   honda.run();  
   }  
}

خروجی :

Compile Time Error

همان طور که مشاهده می کنید متدی که در کلاس پدر با final تعریف شده است، در بدنه ی کلاس فرزند قابل بازنویسی نبوده و کامپایلر به محض برخورد با آن خطا صادر می کند.
کلاس final در Java

زمانی که برنامه نویس کلاسی را با کلیدواژه ی final اعلان می کند، آن کلاس کاملا قابلیت وراثت را از دست می دهد. به عبارت دیگر، هیچ کلاسی نمی تواند از آن ارث بری داشته باشد.
مثال کاربردی از کلاس final

final class Bike{}  
class Honda1 extends Bike{  
  void run(){System.out.println("running safely with 100kmph");}  
  public static void main(String args[]){  
  Honda1 honda= new Honda();  
  honda.run();  
  }  
}

خروجی :

Compile Time Error

به دلیل اینکه کلاس Bike با کلمه ی کلیدی final علامت گذاری شده، کلاس Honda1 نمی تواند از آن ارث ببرد و ارث بری از آن در برنامه ی بالا سبب رخداد خطای زمان کامپایل می شود.
آیا متد final قابل ارث بری می باشد؟

در پاسخ باید گفت که بله. متدی که در کلاس پدر به صورت final تعریف شده است، قابل ارث بری است اما بدنه ی آن را نمی توان بازنویسی یا به اصطلاح override کرد. مثال:

class Bike{  
  final void run(){System.out.println("running...");}  
}  
class Honda2 extends Bike{  
   public static void main(String args[]){  
    new Honda2().run();  
   }  
}

خروجی : running…

متغیر تهی یا مقداردهی نشده ی final چیست؟ blank final variable چیست؟

یک متغیر که با کلیدواژه ی final علامت گذاری و در زمان تعریف مقداردهی نشده است را متغیر تهی غیر قابل مقداردهی یا به انگلیسی blank final variable گویند. هر زمان که لازم دارید متغیری در زمان ایجاد یک آبجکت برای یکبار مقداردهی شده و محتوایش در آینده هیچگاه تغییر نکند، می توانید از امکان نام برده در جاوا استفاده کنید. برای مثال می توان به شماره حساب دائمی یک کارمند (PAN CARD number) اشاره کرد. تنها یک راه برای ویرایش و مقداردهی متغیر final وجود دارد و آن هم داخل تابع سازنده (constructor) هست.

مثال کاربردی از تعریف یک متغیر final

class Student{  
int id;  
String name;  
final String PAN_CARD_NUMBER;  
...  
}

آّیا می توان متغیر فاقد مقدار و تهی که به صورت final تعریف شده است را مقداردهی کرد؟

در پاسخ باید گفت که بلی. این کار منحصرا در بدنه ی تابع سازنده (constructor) امکان پذیر می باشد.

class Bike10{  
  final int speedlimit;//blank final variable  
  Bike10(){  
  speedlimit=70;  
  System.out.println(speedlimit);  
  }  
  public static void main(String args[]){  
    new Bike10();  
 }  
}

متغیر فاقد مقدار final که به صورت static تعریف شده/ static blank final variable

یک متغیر که با دو کلیدواژه ی (با مقداری غیر قابل تغییر) final و (مشترک بین تمامی نمونه های ساخته شده از کلاس و متعلق به کلاس کلی) static نشانه گذاری شده و در زمان تعریف مقداری به آن اختصاص داده نشده باشد را در اصطلاح static blank final variable می گویند. این نوع متغیر تنها در قطعه کد static قابل مقداردهی می باشد.
مثال کاربردی از static blank final variable

class A{  
  static final int data;//static blank final variable  
  static{ data=50;}  
  public static void main(String args[]){  
    System.out.println(A.data);  
 }  
}

پارامتر final چیست و چه کاربردی دارد؟

اگر پارامتری را با کلیدواژه ی final اعلان نمایید، مقدار آن پارامتر دیگر در آینده قابل ویرایش نخواهد بود.

class Bike11{  
  int cube(final int n){  
   n=n+2;//can't be changed as n is final  
   n*n*n;  
  }  
  public static void main(String args[]){  
    Bike11 b=new Bike11();  
    b.cube(5);  
 }  
}

آیا می توان تابع سازنده را نیز به صورت final تعریف کرد؟

خیر چرا که تابع سازنده هیچگاه به ارث برده نمی شود.


برچسب ها
نظرات

توجه : لطفاً فقط نظرات خود را از این طریق ارسال نمایید و سوالات و مشکلات خود را در انجمن سایت مطرح نمایید.