Sabitler

"Amigo, Java'da tüm değişkenlerin değiştirilemeyeceğini biliyor muydun?"

"Bu nasıl Kim? Gerçekten de 'değişken' kelimesinin kendisi değişimden bahsediyor."

"Buna hiç şüphe yok. Diğer birçok programlama dilinde olduğu gibi Java'da da sabitler , yani değerleri değiştirilemeyen değişkenler vardır . Ve 'sabit' kelimesinin kendisi sabitlikten söz eder."

"Peki onlar ne için?"

Pi"Genellikle, yılın aylarındaki günlerin sayısı veya sayısı gibi bir tür temel şey için kullanılırlar . Bununla birlikte, ilke olarak, bir programcı, eğer bunu yapmaya karar verirse, herhangi bir değişkeni sabit yapabilir. yani gerekli."

"Bir arabanın adı, rengi veya haftanın bir gününün adı gibi mi demek istiyorsun?"

"Doğru fikre sahipsin. Değiştirilmemesi gereken her şey."

"Peki bu sabitler Java'da neye benziyor?"

"Java'nın onlar için özel bir anahtar kelimesi vardır: . Sabit bir değişken oluşturmak, sıradan bir değişken oluşturmakla aynı görünür. Tek fark, değişkenin türünden önce kelimeyi şu şekilde finalyazmanız gerekir:final

final Type name = value;

"Bir sabit oluşturup ona farklı bir değer atamaya çalışırsanız ne olur?"

"Sorulacak doğru soru bu! Ve doğru cevap şudur: Bir değişkene farklı bir değer atamaya çalışırsanız final, programınız derlenmez."

"Ya bir değişken bildirirseniz finalancak ona bir değer atamazsanız?"

"Bunu yapmanın bir anlamı yok, bu yüzden Java'da da buna izin verilmiyor. Bir finaldeğişken, bildirildiğinde başlatılmalıdır, yani ona bir değer atamalısınız. Bu kuralın bir istisnası vardır: başlatmayı hareket ettirebilirsiniz. bir yapıcıya statik bir sınıf değişkeni Ama bunu daha sonra öğreneceksiniz.

"Bununla birlikte, olan her şey finalbir sabit değildir. Java geliştiricileri, anahtar sözcüklerin sayısını azaltmak için sözcüğü finalyalnızca sabitler bildirmekten daha fazlası için kullanırlar. finalYöntemlere ve hatta sınıflara da uygulanabilir. Olarak bildirilen yöntemler finalgeçersiz kılınamaz ve bir sınıf finalmiras alınamayacağı beyan edilmiştir ."

"Uh... Geçersiz kılındı ​​mı? Miras mı kaldı? Şu anda hangi dili konuşuyorsun?"

"Nesne yönelimli programlama dili. Çok yakında öğreneceksiniz. O zamana kadar, güzel terminolojinin tadını çıkarın."

"Tamam. Yani, finaldeğişkenlerin, sınıfların ve yöntemlerin önüne konulabilir ve bu anahtar sözcük onları bir anlamda değişmez yapar?"

"Evet. Ayrıca finaldeğiştirici herhangi bir değişkenden önce eklenebilir: yerel değişkenler, yöntem parametreleri, sınıf alanları ve statik sınıf değişkenleri.

"Hatırlanması gereken önemli şey şu: finalBir değişken adından önce, o değişkende yapılacak herhangi bir değişikliğe karşı koruma vardır . Bir değişken bir nesneye referans depoluyorsa, o zaman nesne yine de değiştirilebilir."

"Tam olarak anlamıyorum."

"Çok yakında anlayacaksın. İşte bir örnek:

final int[] data = {1, 2, 3, 4, 5, 6};

data = {6, 7, 8, 9};

data[0] = 0;
data[1] = 0;
data[2] = 0;
Bir dizi oluşturuyoruz.

Buna izin verilmez: değişken dataolarak bildirilir final.

Ama bunu yapabilirsin.
Ve ayrıca bu.

"Anladım. Bu çok zor."

genel sabitler

"Küresel sabitlerin ne olduğunu düşünüyorsun?"

"Sanırım global sabitler muhtemelen global değişkenler gibidir, sadece sabitlerdir?"

"Kesinlikle. Programınızda genel sabitleri bildirmeniz gerekiyorsa, statik sınıf değişkenleri oluşturun ve onları publicve yapın final. Bu tür değişkenlerin adları için özel bir stil vardır: bunlar, tümü büyük harflerle yazılır ve alt çizgi karakteri kullanılır. ayrı kelimeler.

Örnekler:

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;
}

Değişken gölgeleme

"Daha önce de söylediğim gibi, tek bir yöntemde aynı ada sahip birden çok yerel değişken oluşturamazsınız. Farklı yöntemlerde oluşturabilirsiniz."

"Biliyorum ki!"

"Ama muhtemelen bilmediğiniz şey, bir sınıftaki değişkenler ile bir yöntemdeki yerel değişkenlerin aynı ada sahip olabileceğidir.

Örnek:

kod Değişken görünürlük
public class Solution
{
   public int count = 0;
   public int sum = 0;

   public void add(int data)
   {
     sum = sum + data;
     int sum = data * 2;
     count++;
   }
}

count, sum
count, sum
count, sum
count, sum
count, sum
count, sum, data
count, sum, data
count, sum, data
count, sum, data
count, sum

"Yöntemde add, adlı yerel bir değişken bildirdik sum. Yöntemin sonuna kadar, örnek değişkeni gölgeler (veya maskeler ) sum.

"Hmm... Bir bakıma bunun beklenen davranış olduğunu söyleyebilirim."

"Ama hikaye bununla sınırlı değil. Görünüşe göre bir örnek değişken yerel bir değişken tarafından gölgeleniyorsa, yöntem içinde örnek değişkene atıfta bulunmanın bir yolu var. Bunu, anahtar kelimeyi adından önce yazarak yapıyoruz this. :

this.name

"Ad çakışmasının başarıyla çözüldüğü bir örnek:

kod Değişken görünürlük
public class Solution
{
   public int count = 0;
   public int sum = 0;

   public void add(int data)
   {
     int sum = data * 2;
     this.sum = this.sum + data;
     count++;
   }
}

this.count, this.sum
this.count, this.sum
this.count, this.sum
this.count, this.sum
this.count, this.sum
this.count, this.sum, data
this.count, this.sum, data, sum
this.count, this.sum, data, sum
this.count, this.sum, data, sum
this.count, this.sum

countve değişkenleri , anahtar kelime sumolsun ya da olmasın her yerde kullanılabilir this. sumYerel değişkenin örnek değişkeni gölgelediği satırlarda sum, sumörnek değişkene yalnızca anahtar kelime kullanılarak erişilebilir this.

"Elbette, bunu uygulamam gerekecek."

"Başaracaksın."

"Ya yalnızca (statik olmayan) bir örnek değişkeni yerine bir statik sınıf değişkeni gölgelenirse? Ona üzerinden erişemezsin this?"

"Haklısın. this anahtar sözcüğü çalışmaz. Buna sınıf adıyla başvurman gerekir:

ClassName.name

Örnek:

kod Değişken görünürlük
public class Solution
{
   public static int count = 0;
   public static int sum = 0;

   public void add(int data)
   {
     int sum = data * 2;
     Solution.sum = Solution.sum + data;
     count++;
   }
}

Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum, data
Solution.count, Solution.sum, data, sum
Solution.count, Solution.sum, data, sum
Solution.count, Solution.sum, data, sum
Solution.count, Solution.sum

count"Dikkat: ve sumstatic değişkenlerine, sınıf adını önek olarak veya kullanmadan her yerden erişebilirsiniz . Yerel değişkenin örnek değişkeni gölgelediği Solutionsatırlarda , sınıf değişkenine erişim yalnızca önek olarak kullanıldığında mümkündür .sumsumsumSolution

forDöngü içindeki değişkenler

for"Ve bir küçük ama ilginç gerçek daha. Ayrıca bir değişkenin özel bir şekilde bildirildiği bir yer var - bir döngünün içinden bahsediyorum ." Tipik olarak, bir döngü parantez içinde forbir değişkene sahiptir . counterVe bu değişkenin görünürlüğü ne olacak? Sonuçta, döngünün gövdesinde değil. Tüm yöntem bu mu? Ya da değil?"

" Bununla ilgili bir şeyler duymuştum. Anladığım kadarıyla, bir fordöngünün başlığında bildirilen bir değişken yalnızca döngünün gövdesinde ve döngünün başlığındafor görünür . "

"Aferin Amigo. Ama yine de bu malzemeyi pekiştirmek için bir örneğe bak:

kod Değişken görünürlük
public static void main(String[] args)
{
   int a = 0;

   for (int i = 0; i < 10; i++)
   {
     System.out.println(i);
   }

   System.out.println("end");
}


a
a
a, i
a, i
a, i
a
a
a

"Yani, kodumda aynı ada sahip bir sayaç değişkeni ile arka arkaya birkaç döngü yazabileceğimi ve hiçbir sorun olmayacağını mı söylüyorsunuz?"

"Sorun olmazdı. İşte bak:

kod Değişken görünürlük
public static void main(String[] args)
{
   int a = 0;

   for (int i = 0; i < 10; i++)
   {
     System.out.println(i);
   }

   for (int i = 0; i < 10; i--)
   {
     System.out.println(i);
   }

   System.out.println("end");
}


a
a
a, i
a, i
a, i
a
a
a, i
a, i
a, i
a
a
a