السلام عليكم
مالفرق بينهما
قرأت ان ال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 والذي يعني أن كل كائن له نسخة خاصة من ذلك المتغير.
التعليقات