Diğer programlama dillerinde iki çeşit değişken vardır : yerel ve global. Ancak Java’da bu ayrım yoktur. Çünkü global değişkenler, Java’nın sıkıyönetimine uymazlar. Java’da da global tipte değişkenler deklare edilebilir ancak bu bir kural değil, istisnadır. Yerel değişkenler ise bulundukları yerde(sınıf, metot vb..) üretilen değişkenlerdir.
Diğer programlama dillerinde iki çeşit değişken vardır : yerel ve global. Ancak Java’da bu ayrım yoktur. Çünkü global değişkenler, Java’nın sıkıyönetimine uymazlar. Java’da da global tipte değişkenler deklare edilebilir ancak bu bir kural değil, istisnadır. Yerel değişkenler ise bulundukları yerde(sınıf, metot vb..) üretilen değişkenlerdir.
Temelde bu konuda bilinecek tek şey var: Java’da global değişken yoktur. Dolayısıyla Java’da bazı değişkenleri “global” olarak nitelemek doğru değildir.
Değişkenlerin görülebildiği ya da erişilebildiği alana, kapsam (scope) denir. Java’da değişkenlerin kapsamları derleme zamanında belirlenir ve çalışma zamanında değişmez. Bu yüzden Java, statik kapsamlı (statically scoped ya da lexically scoped) dillerdendir.
Açıkçası, kapsam sadece değişkenler için geçerli değildir. Herhangi bir tanıtımın (declaration) kapsamından bahsedilebilir. Sadece değişkenlerin değil aynı zamanda örneğin “package” ya da “import” ifadelerinin kapsamları da ele alınır. Bunlarla anlatılmak istenen şey, bir Java kaynak kodu dosyasında bir “package” ya da bir “import” ifadesi varsa, bu ifadelerin getirdiği şeylerin etki alanıdır. Örneğin java paketi daima kapsamdadır. Java’da bir değişkenin kapsamını belirleyen şeyin genel olarak bloklar olduğunu söyleyebiliriz. Bir blokta tanımlanan bir değişkenin kapsamı, tanıtıldığı (declaration) yerden içinde bulunduğu bloğun sonuna kadardır. Değişkenlerin kapsamlarına, içinde tanıtıldığı bloğun alt bloklarında da dahildir. Java’da en geniş blok sınıf bloğudur.
Java’da sınıf kapsamında tanıtılan değişkenlere “üye değişkenler” (member variables) denir. Üye değişkenler ya nesne değişkenidir (instance variable ya da object variable) ya da sınıf değişkenidir (class variable). Sınıf değişkenleri ise “static” olarak tanımlanır. Üye değişkenler dışındaki her türlü değişken Java’da sınıfın alt kapsamlarında tanımlanır ve bu yüzden “yerel değişken” olarak adlandırılır. Yerel değişkenleri ifade etmek için Ingilizce’de “local”, “stack”, “temporary” ve “automatic” sıfatları da kullanılır.
Yerel değişkenlerin kapsamı, tanıtıldıkları yerden, o blokun sonuna kadardır. Buna, benzer şekilde tüm alt kapsamlar dahildir. Java’da sınıfın içindeki bloklardan herhangi birinde tanımlanan değişkenlere, kapsamları açısından “local” yani “yerel” değişken denmesi, yerel olmayan, üye değişkenlere “global” denmesini gerektirmez. Hatta global değişken (global variable) kavramının programlama dilleri açısından ifade ettiği özel anlamdan dolayı ki “global değişken” bu şekilde bir terim olmuştur, Java’da global değişken yoktur. Üye değişkenlerin global oluşundan bahsedeceksek, olsa olsa “sınıfa global” (global to class) denebilir.
Global değişken, programlama dillerinde kullanılan bir terimdir, özel anlama sahip bir kavramdır ve tekniktir. Global değişkenler her dilde desteklenmezler. Ama desteklendiklerinde farklı dillerde farklı şekillere, kurallara hatta anahtar kelimelere sahiptir. Örneğin C ve C++, global değişkenler için “extern” anahtar kelimesine sahiptir. PHP ya da Python gibi bazı diller ise “global” anahtar kelimesiyle global değişken oluşturmaya izin verirler.
Global değişkenlerin kapsamlarının tüm program ya da bir başka deyişle tüm kod tabanının (code base) olmasından dolayı, bu türden değişkenlerin faydadan çok zarar getirdikleri iddia edilerek eleştirilmiştir. Kısaca özetlemek istersek, global değişkenlerin bulunmasının, çalışma zamanında,programın farklı kısımları tarafından kullanılmasının getireceği sıkıntılardan dolayı kullanırken dikkatli olmak gerekir.
Peki, Java’da global değişken olmamasına rağmen biz Java ile yazdığımız programlarda global olarak kullanılabilecek değişkenler oluşturmaz mıyız? Tabi ki oluşturabiliriz. Nihayetinde pek çok dil ve Java, veriyi saklamak için pek çok farklı bilgi saklama (information hiding) yapısına sahiptir. Ama nihayetinde bu yapıları kullanıp kullanmamak programcının elindedir. Örneğin public anahtar kelimesiyle her yerden ulaşılır yapılan her static değişken, içinde bulunduğu sınıf üzerinden rahatlıkla erişilebilir. Bu durumun problem olmaması için bu tür değişkenlerin, final anahtar kelimesiyle “değişken” olmaktan çıkarılıp, sabite haline getirilmesi tavsiye edilir ki sistemde hiç bir başka yer bu tür sabitelerin değerini değiştiremesin, sadece okusun. Bu şekilde bu gibi sabiteleri kimin ne zaman güncelleyeceğini ya da güncellediğini takip etmek gerekmez ve bu durum thread-safe bir yapı sunar.
Kısaca söylersek, Java’da global değişken yoktur çünkü hiç bir değişkenin global bir kapsamı yoktur. Fakat yine de sınıf üzerinde tanımlanıp, her yerden ulaşılabilen değişkenler oluşturulabilir. Bu durumlarda, bu türden değişkenlerin sadece okunabilen olarak kullanılması ve mümkünse final yapılarak sabite haline getirilmesi, sistemin parçalarının aralarındaki bağımlılıkları azaltmak açısından önemlidir. Değişkenlerin yaşam süreleri bulundukları kod bloğu kadardır. Yani bir kod bloğu içerisinde tanımlanan değişkenler, o kod bloğundan çıkıldığında ulaşılamaz olurlar ve zamanla bellekten silinirler.

Örnekte 5 satırda tanımladığımız değişkene dışarıdan erişmeye çalıştığımızda hata almaktayız. Programı çalıştırdığımızda hata aldık. Hata gayet basittir. Değişkenimize sınırları dışından ulaşmaya çalıştık ve hata aldık. “sayi” değişkenimiz “metod()” metodumuzda tanımlanmıştır ve bu metodun kod bloğu dışına çıkıldığında tanımsızdır. Yani derleyicimiz yazdırılmasını istedğimiz “sayi” değişkenini sadece bulunduğu kod bloğunda aradı, bulamadı ve hata verdi.“sayi değişkeni tanımlanmamıştır”. Olmayan bir değişkeni de haliyle ekrana yazdıramadı.



