Merhaba Arkadaslar,
Bu dersimizde Java’da , variable (degisken) konusunu isleyecegiz.
Javada 2 tip degisken vardir.
primitive
reference variable (referans degiskeni)
primitive Degiskenler (primitive variables)
primitive degiskenler su 8 tipden biri olabilir ;
char, boolean, byte , short , int , long , double , float
primitive bir degisken tanimlandiginda turu degistirilemez yani int a ,bir alt satirda short a olarak degismez. Java ciddi bir dildir bu tarz kontrollere onem verir
primitive degiskenler su durumlarda tanimlanabilir ,
- bir class variable (yani static degisken)
- instance variable (objeye ait degisken)
- method parametresi
Burada bir dip not vermek istiyorum bir cok insan bu kavrami karistirmakta veya ayni sanmaktadir.
metot tanimlamasinda kullanilan degiskenler parametredir, methodu cagirirken gonderilen degiskenler ise argumandir .
Bu 8 primitive degiskenden 6 tanesi ( char ve boolean haric ) signed (isaretli) yani negatif ve pozitif degerler alabilir.
Referans Degiskenler (reference variables)
- Bir referans degisken bir objeyi isaret eder.
- Bir referans degisken bir kez tanimlanir ve turu degismez.
- Bir referans degisken tanimlandigi turde veya alt turde (subtype) objeyi isaret edebilir.
Ilerleyen derslerde detaylica bahsedecegim burada sadece degisken tanimlama ile ilgileniyoruz.
Primitive Degiskenlerin Tanimlanmasi
primitive degiskenler class variable(sinif degiskeni/static), instance variable, method parametresi, local degisken olarak tanimlanabilir.
Asagidaki tabloda 6 tane numerik primitive degiskenin bilgileri yer almaktadir. float ve double degiskenlerin sinirlari diger 4 degisken gibi belirli degildir. ( it is complicated )
boolean degisken , true veya false olabilir. Kac bit olacagi JVM e baglidir.
char degisken ise 16-bittir. char degisken isaretsiz oldugu icin yani negatif deger olmayacagi icin 0 dan 65535 (2^16) ya kadar siniri vardir.
Referans Degiskenlerin Tanimlanmasi
referans degiskenler ; sinif degiskeni, instance variable, method parametre degiskeni ve local degisken olarak tanimlanabilir.
Instance Variable
instance variable , objenin kendine ait olan degiskenidir. instance degiskenler metot icerisinde tanimlanamaz.
- 4 erisim seviyesini kullanabilir. ( public, protected, private)
- final , transient olabilir.
- abstract, synchronized, strictfp, native, static olarak tanimlanamaz.
- static tanimlanan degiskenler instance variable degil class variable olur.
class A { private String insVar1; protected int insVar2; public boolean insVar3; }
Local (Automatic/Stack/Method) Degiskenler
- Local degiskenler bir metotla birlikte tanimlanan degiskenlerdir, yani instance variable objeye aitken local degiskenler metotlara aittir.
- Local degiskenlerin yasam alani ilgili metotla sinirlidir.Metot tamamlaninca degiskende ucurulur 🙂
- Local degiskenler her zaman stackte tutulur, heap’te tutulmaz.
- Degiskenimiz referans degiskeni de olsa , stackte tutulur fakat referans oldugu obje heaptedir. Local Obje kavramindan kasit local tanimli referans degiskenidir. Objelerin hepsi heaptedir.
- Local degiskenler private , public,protected, transient, abstract, volatile,static gibi anahtar kelimeleri alamaz, sadece final anahtar kelimesini alabilirler.
- Genel olarak bir local degiskene tanimlandigi satirda deger verilir. Bu bir zorunluluk degildir fakat bir local degiskeni kullanmadan once mutlaka deger atanmalidir.
public class LocalVarTest { public static void main(String[] args) { int a; int b; String s; System.out.println(a); } }
Yukaridaki ornekte a,b,s local degiskenlerini tanimladik ne zaman bir degiskeni kullanmamiz gerekti (System.out.println(a);) bize bu satirda derleme hatasi verecektir.
The local variable a may not have been initialized
- Bir local degisken tanimlandigi metodun disindan kullanilamaz.
public class LocalVarTest { public void method1(){ int var1; } public void method2(){ var1=10; } }
var1 cannot be resolved to a variable.
- Local degiskenin adiyla instance degiskenin adi ayni olabilir. Buna Shadowing denir.
public class ShadowingTest { int shadow = 10; public void method1() { int shadow = 15; System.out.println("Local Variable:" + shadow); } public void method2() { System.out.println("Instance Variable:"+shadow); } public static void main(String[] args) { new ShadowingTest().method1(); new ShadowingTest().method2(); } }
shadow instance degiskenimize 10 degerini atadik method1 de shadow ismindeki local degiskenimize 15 degerini atadik. Su ciktiyi aliriz.
Local Variable:15
Instance Variable:10
Dizi Tanimlanmasi( Array Declaration)
Burada dizilerin tanimlanmasini anlatacagim , ilerleyen derslerde dizilere detaylica bakacagiz insallah
- Bir dizi (array) , ayni turde degiskenleri tutan bir yapidir.
- Bir dizi primitive veya obje referansi tutabilir (refarans degisken) fakat dizinin kendisi mutlaka ama mutlaka objedir dolayisiyla heapte tutulur. Yani primitive array diye bir sey soz konusu degildir.
- int [] myArray ve int myArray[] seklinde tanimlanabilir fakat koseli parantezin degisken isminden once gelmesi onerilir.Ilk tanimlama uygundur.
public class ArrayTest { private int[] myArray; protected int myArray2[]; String[] myArray3; String[][] myArray4; private boolean[] myArray5[]; long[] myarray6 ; public void method1() { final int [] myArray7; char [] myArray8; } }
final Degiskenler
Bir degiskeni final olarak tanimlamak , bu degiskene bir kez deger atandiktan sonra deger atanmasina engel olacaktir. Bir final primitive degiskene 100 degerini atadiysak 100 olarak kalacaktir. Bir final referans degiskenin de referans ettigi objeyi degistiremeyiz. final obje diye bir sey yoktur, final referans degiskeni olabilir.
final anahtar kelimesinden daha onceki derslerde de bahsetmistim , simdi 3 maddede toparlayalim ;
- final degiskeni siniflar icin kullanildiginda bu sinifin kalitilamayacagi anlamina gelmektedir.
final class A { } class B extends A{ }
derleme hatasi aliriz.
- final anahtar kelimesi metotlar icin kullanildiginda o metodun override(ezmek) edilemeyecegi anlamina gelmektedir.
class A { final void method1(){ } } class B extends A{ void method1(){ } }
- final anahtar keliesi degiskenler icin kullanildiginda degiskenin degerinin degistirilemeyecegi anlamina gelmektedir.Derleme zamani hatasi aliriz.
public void method1(){ final int var1=100; var1=200; }
final olmayan instance degiskenlere degisken atamak zorunlulugumuz yoktur fakat final olarak tanimlanirsa mutlaka deger atamamiz gerekmektedir.
class A { final int var1; }
transient Degiskenler
Bir degiskeni transient (gecici) olarak belirlersek JVM (Java Virtual Machine) serilasyon islemi sirasinda bu degiskeni atlayacaktir.
transient anahtar kelimesi sadece instance degiskenler icin kullanilabilir.
volatile Degiskenler
volatile anahtar kelimesi sadece instance degiskenler icin kullanilabilir. Threadlerle calisirken senkronizasyon icin kullanilir , bunun yerine synchronized metotlari kullaniriz.
static Degiskenler ve Metotlar
- static degiskenler ve static metotlar sinifa aittir, herhangi bir objeye ait degildir.
- Butun static degisken ve metotlar yeni bir obje olusturmadan once hazir ve nazirdir.
- Bir static uyenin bir kopyasi vardir. Yani ortak maldir
- method, instance degisken,initialization blocks lar static olarak tanimlanabilir
- constructor(yapilandiric) ,interfaces, local degiskenler,siniflar ( nested olmadigi surece) , inner class method ve instance degiskenleri static olarak tanimlanamazlar.
package purejava6; public class StaticTest { static int var1 = 10; static { var1++; } public static void main(String[] args) { System.out.println(var1++); method1(); } public static void method1(){ System.out.println(++var1); } }
Bu ornek ile yazima son veriyorum 🙂 Ornegi anlamayi size birakiyorum.