Константи
„Амиго, знаеше ли, че в Java не всички променливи могат да се променят?“
"Как така, Ким? Наистина, самата дума "променлива" говори за промяна."
„В това няма съмнение. Както много други езици за програмиране, Java има константи , тоест променливи, чиито стойности не могат да бъдат променяни . И самата дума „константа“ говори за постоянство.“
— И за Howво са?
„Обикновено те се използват за няHowво фундаментално нещо като броя Pi
or броя на дните в месеците от годината. Това каза, по принцип програмистът може да направи всяка променлива константа, ако той or тя реши, че прави така е необходимо."
„Имате предвид като име, цвят на кола or име на ден от седмицата?“
"Имате правилната идея. Всичко, което не трябва да се променя."
„И How изглеждат тези константи в Java?“
"Java има специална ключова дума за тях: final
. Създаването на неизменна променлива изглежда по същия начин като създаването на обикновена. Единствената разлика е, че преди типа на променливата трябва да напишете думата final
, Howто следва:
final Type name = value;
„Какво се случва, ако създадете константа и след това се опитате да й присвоите различна стойност?“
"Това е правилният въпрос! И правилният отговор е следният: ако се опитате да присвоите различна стойност на променлива final
, вашата програма просто няма да се компorра."
„Ами ако декларирате променлива final
, но не й присвоите стойност?“
„Няма смисъл да правите това, така че също не е разрешено в Java. Една final
променлива трябва да бъде инициализирана, когато е декларирана, тоест трябва да й присвоите стойност. Има едно изключение от това правило: можете да преместите инициализацията на статична класова променлива в конструктор. Но ще научите за това по-късно.
„Въпреки това, не всичко, което е, final
е константа. За да намалят броя на ключовите думи, разработчиците на Java използват думата final
за повече от просто деклариране на константи. final
може да се прилага и за методи и дори класове. Методите, декларирани като, final
не могат да бъдат заменени и клас обявени за final
неподлежащи на наследяване."
„Ъъъ... Заменен? Наследен? Какъв език говорите сега?“
„Езикът на обектно-ориентираното програмиране. Ще стигнете до него много скоро. Дотогава просто се наслаждавайте на красивата терминология.“
"Добре. Значи final
може да се постави преди променливи, класове и методи и тази ключова дума ги прави неизменни в няHowъв смисъл?"
„Да. Освен това final
модификаторът може да се добави преди всяHowви променливи: локални променливи, параметри на метода, полета на клас и статични променливи на клас.
"Ето важното нещо, което трябва да запомните: final
преди името на променлива е просто защита срещу всяHowви промени в тази променлива . Ако променлива съхранява препратка към обект, тогава обектът все още може да бъде променен."
— Не разбирам съвсем.
„Скоро ще разберете. Ето един пример:
|
Създаваме масив. Това не е позволено: променливата data е декларирана като final . Но можете да направите това. А също и това. |
„Разбрах. Това е сложно.“
Глобални константи
„Какви според вас са глобалните константи?“
„Предполагам, че глобалните константи вероятно са като глобалните променливи, само константи?“
„Точно така. Ако трябва да декларирате глобални константи във вашата програма, създайте статични променливи на класа и ги направете public
и final
. Има специален стил за имената на такива променливи: те се изписват изцяло с главни букви, с долна черта, използвана за отделни думи.
Примери:
class Solution
{
public static final String SOURCE_ROOT = "c:\\projects\\my\\";
public static final int DISPLAY_WIDTH = 1024;
public static final int DISPLAY_HEIGHT = 768;
}
Променливо засенчване
"Както казах преди, не можете да създадете множество локални променливи с еднакви имена в един метод. В различни методи можете."
"Знам това!"
„Но това, което вероятно не знаете е, че променливите в клас и локалните променливи в метод може да имат едно и също име.
Пример:
Код | Променлива видимост |
---|---|
|
|
„В add
метода декларирахме локална променлива с име sum
. До края на метода тя засенчва (or маскира ) sum
променливата на екземпляра.“
„Хм... Бих казал, че в известен смисъл това е очакваното поведение.“
„Но това не е краят на историята. Оказва се, че ако променливата на екземпляра е засенчена от локална променлива, все още има начин да се обърнете към променливата на екземпляра в рамките на метода. Правим това, като напишем ключовата дума преди нейното this
име :
this.name
„Ето пример, при който конфликтът с имена е разрешен успешно:
Код | Променлива видимост |
---|---|
|
|
Променливите count
и sum
са достъпни навсякъде със or без this
ключовата дума. На редове, където sum
локалната променлива засенчва sum
променливата на екземпляра, sum
променливата на екземпляра може да бъде достъпна само чрез this
ключовата дума.
— Очевидно ще трябва да упражнявам това.
— Ще се справиш.
"Ами ако статична променлива на клас е засенчена, а не просто (нестатична) променлива на екземпляр? Не можете да получите достъп до нея чрез this
?"
„Прави сте. Тази ключова дума няма да работи. Трябва да се обърнете към нея чрез името на класа:
ClassName.name
Пример:
Код | Променлива видимост |
---|---|
|
|
"Обърнете внимание: можете да получите достъп до статичните променливи count
и sum
навсякъде със or без да използвате името на класа Solution
като префикс. В тези редове, където sum
локалната променлива засенчва sum
променливата на екземпляра, достъпът до sum
променливата на класа е възможен само когато се използва Solution
като префикс.
Променливи вътре в for
цикъл
„И още един малък, но интересен факт. Има и място, където променливата се декларира по специален начин — говоря за вътре в цикъл for
. “ Обикновено for
цикълът има counter
променлива в скоби. И Howва ще бъде видимостта на тази променлива? В крайна сметка не е в тялото на цикъла. Целият метод ли е? Или не?"
„Вече съм чувал нещо за това. Доколкото разбирам, променлива, декларирана в заглавката на цикъл, for
се вижда само в тялото на цикъла и в заглавката на for
цикъла .“
„Браво, Амиго. Но все пак вижте един пример, за да подсorте този материал:
Код | Променлива видимост |
---|---|
|
|
„Значи искаш да кажеш, че в моя code мога да напиша няколко цикъла един след друг с променлива брояч със същото име и няма да има проблеми?“
„Няма да има проблеми. Ето вижте:
Код | Променлива видимост |
---|---|
|
|
GO TO FULL VERSION