Merhaba Arkadaslar,
Bu yazimizda Java’da degiskenlerin kapsam alanlarindan(variable scope) yani bir degisken Java kodumuz icerisinde nerede biliniyor nerede gecerli ya da nerede bilinmiyor ve gecersiz(compile error/derleme hatasi) olur bunu inceleyecegiz. Bir onceki yazida Variable/degisken nedir sorusuna da cevap aramistik.
Ornek sinifimiz uzerinde inceleyelim ;
CoolClass.java
public class CoolClass { static int count = 20; // static variable String s; // instance variable int i; // instance variable { s = "Initialization block"; int block = 250; } public CoolClass() { // constructor // yapilandirici i += 10; int j = 100; } void coolMethod() { int k = 25; // local variable for (int t = 0; t < 10; t++) k += k + t; } }
- count , static degiskendir.
- i , instance degiskendir.
- k, local degiskendir.
- t, block degiskenidir yani local degiskendir.
- block, init block degiskenidir.
- j, constructor/yapilandirici degiskenidir yani local degiskendir.
Simdi de bu degiskenlerin yasam alanlarini inceleyelim.
- static degiskenler en genis yasam alanina sahiptirler(variable scope). static degiskenler , sinif JVM( Java Virtual Machine) tarafindan yuklendiginde (load) olusturulur (create) ve ilgili class JVM de kaldigi surece static degiskenler de yasayacaktir.
- static degiskenlerden sonra yasam alani genisligi acisindan instance degiskenler gelmektedir. Bir instance variable , instance olusturuldugunda (new) yaratilir ve instance kaldirilina kadar gecerli olacaktir.
- Daha sonrasinda ise local degiskenler gelmektedir. local degiskenler ilgili metotta gecerli olacaktir ve bu metot stackte oldugu surece hayatta olacaktir. Aslinda yine de hayatta olabilirler fakat kapsam disi olacaklardir (out of scope)
- block degiskenleri sadece ilgili blockta gecerli olacaktir. { } disinda bu degiskenlerin bir yasam alani yoktur.
Simdi de daha iyi anlayabilmek icin bir kac orne uzerinde incelemelerde bulunalim ve genel hatalari gozden gecirelim;
- static bir metottan non-static degiskenlere (instance) ulasmak.
public class ScopeError { int a; public static void main(String[] args) { System.out.println(a); } }
Onceki yazilarda da belirtigimiz gibi, static bir metottan non-static bir degisken/metota direkt olarak ulasamayiz.Cunku a, bir instance variabledir ve biz instance kullanmadan ulasmaya calisiyoruz.
- local bir degiskene farkli bir metottan erismek
public class ScopeError { public static void main(String[] args) { ScopeError se = new ScopeError(); se.method1(); } void method1() { int y=10; System.out.println(y); y++; method2(); } void method2(){ //y++; // derleme hatasi } }
- Bir block degiskenine , block sonlantiktan sonra erismeye calismak.
void method3() { for (int j = 0; j < 5; j++) { System.out.println(j); } // System.out.println(i); //compile error //derleme hatasi for (int j = 0; j < 5; j++) System.out.println(j); // System.out.println(j); //compile error //derleme hatasi int k=0; for (int j = 0; j < 5; j++) k++; for (int j = 0; j < 5; j++) int z=10; //compile error }
1. for dongusunde j degiskenini for block’u disinda kullanmayi calisinca derleme zaman hatasi aldik. Peki 2.for dogunsunde neden hata aldik ? Dikkat ederseniz { } kullanmadik , bu nedenle for dongusunden sonra sadece bir ifade gecerli olacaktir. (statements)
3.for dongusu sorunsuza calisirken 4.for donsunde yine hata aldik ! Dikkat ederseniz bir for dongusunden sonra {} kullanilmazsa tek satir degil tek bir statement gecerli olacaktir. int z=10; bir expressiondir. Daha fazla detay icin ;
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/expressions.html
motoapk I love you
A round of applause for your post. Great.