* Константи в Java
Публикувано на 15 октомври 2009 в раздел ПИК3 Java.
Константите в Java се създават чрез ключова дума "final". Както е по дефиниция - константите задължително се инициализират и след това не могат да бъдат променяни:
final int x = 5; // x = 6; <<< Не е възможно
В Java обаче е възможно константата само да се декларира и да бъде инициализирана по-късно:
final int x; java.util.Scanner s = new java.util.Scanner(System.in); x = s.nextInt();
Все пак след тази инициализация x не може да бъде променяна, т.е. се държи напълно като константа. Така всъщност казваме, че имаме два типа константи:
- Създадени по време на компилация (първия пример);
- Създадени по време на изпълнение (втория пример).
Ключовата дума final важи за всякакви променливи:
public class finalExample{
public static void main(String[] args){
final A obj = new A(3);
obj.x = 5; // Няма проблем - x не е константа
// obj = null; <<< невъзможно - obj е константа!
}
}
final class A{
public int x;
public A(int x){
this.x = x;
}
}
В случая виждаме, че полетата на самия обект не са непроменяеми. Не може да бъде променен само адреса на променливата, която "сочи" към този обект. Въпреки, че това е възможно, то въобще не се използва.
В Java съществуват още две понятия - константни методи и константни класове. Те също използват ключовата дума final.
Константните методи не могат да бъдат предефинирани в клас-наследник. Например:
class A{
public A(){}
final void func(){
System.out.println("Final function!");
}
}
class B extends A{
public B(){ super(); }
// func() in B cannot override func() in A;
// overridden method is final
// void func(){
// System.out.println("Predefined?");
// }
}
Константните класове пък са такива класове, които не могат да бъдат наследявани:
final class A{
public A(){}
}
// cannot inherit from final A
//class B extends A{
// public B(){ super(); }
//}
В общи линии константни методи и константни класове се създават тогава, когато желаем сигурност на данните и искаме да сме уверени, че никой няма да създава обекти подобни на нашите, но с променена функционалност.
Добави коментар