السلام عليكم
مالفرق بينهما
قرأت ان الfinal للمتغيرات الغير قابله للتعديل
لكن عند اسدعائها مع الobject تبين لي انه من الممكن تعديلها
ام final static
فلم اتمكن من تعديلها
المتغير المعرف بـ final، لا يمكن إعطاءه قيمة جديدة من بعد أن ما تم إعطائه قيمة أولية. بمعنى آخر، لو لدينا متغير نصي من نوع local variable (أي داخل دالة) وقمنا بتعريفه كـ final:
final String a;
فإنه لا يقبل إسناد قيمة له إلا مرة واحدة:
final String a;
a = "test";
a = "test2"; // ERROR
أو
final String a = "test";
a = "test2"; // ERROR
يمكن أيضاً تعريف الـ parameter كـ final، ويعني بأن قيمته ستكون ثابتة داخل الدالة:
public void foo(final int param(
{
param = 6; // ERROR
param++; // ERROR
}
يمكن أيضاً تعريف instance variable كـ final، ويجب إسناد قيمة أولية له إما بشكلٍ مباشر أو من خلال الـ constructor أو بداخل instance initializer:
public class Test
{
private final ClassA a = new ClassA();
private final ClassB b;
private final ClassC c;
public Test()
{
b = new ClassB();
}
{
c = new ClassC();
}
}
يمكن أيضاً تعريف static variable كـ final، ويجب إسناد قيمة أولية له إما بشكلٍ مباشر أو من خلال الـ static initializer:
public class Test
{
private static final ClassA a = new ClassA();
private static final ClassB b;
static
{
b = new ClassB();
}
}
يرجى ملاحظة أنه في حالة الكائنات ما زال بإمكانك التعديل على نفس الكائن، ولكن لا يمكن تغير الكائن الذي يشير إليه المتغير:
final ClassA a = new ClassA();
a.setX(123);
a = new ClassA(); // ERROR
يستخدم final أيضاً على مستوى الكلاس ويعني أن الكلاس لا يمكن الوراثة منه. يستخدم final أيضاً على مستوى الدالة ويعني بأن الدالة لا يمكن عمل Override لها.
بالنسبة لـ static، فكما ذكر الأخ WGH، تعني بأن المتغير مشترك بين جميع العينات بعكس الـ instance variable والذي يعني أن كل كائن له نسخة خاصة من ذلك المتغير.
final للثوابت, التي لا يتم تعديلها بعد اول مرة يتم فيها اعطائها قيمتها.
Static تعني ان المتغير يرتبط بل Class وليس ال Object, يعني عندما تعرف متغير كـ Static, فيكون هذا المتغير مشترك بين جميع ال Object التي تم عملها عن طريق هذه الكلاس.
وتستطيع استدعاء ال Static من خلال اسم الكلاس : Abc.X
حسناً, جميعنا نعلم ان درجة غليان الماء = تقريباً 100 درجة, ونعلم ايضاً كمبرمجين ان هذه القيمة ثابتة, ولا داعي ان تتغير في البرنامج ابداً,
لذلك نستعمل final int waterBoile = 100;
حسناً, لو حاولنا خلال الكود ان نقوم بتغيير هذه القيمة, مثلاً waterBoile = 80;
سيظهر لنا Error يفيد بأن هذه القيمة لا يمكن تعديلها لانها final.
حسناً لنفرض اننا عرفنا المتغير هكذا, final int waterBoile; بدون ان نسند له قيمة.
لو حاولنا خلال الكود ان نقول waterBoile = 80; سيتم تنفيذ الكود بدون اي خطأ, الان نحن اعطيناها قيمة اول مرة,
لكن لو حاولنا بعد ذلك ان نعدل هذا المتغير ليصبح waterBoile = 50; سيظهر لنا Error
التعليقات