Pure Java – 06 Declare Class Members – 03 Variable

26 Haz 2016
79
1
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 **** 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 **** method1(){
int var1;
}
public **** 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 **** method1() {
int shadow = 15;
System.out.println("Local Variable:" + shadow);
}

public **** method2() {
System.out.println("Instance Variable:"+shadow);
}
public static **** 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 **** 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 **** method1(){

}
}
class B extends A{
**** method1(){

}
}
final anahtar keliesi degiskenler icin kullanildiginda degiskenin degerinin degistirilemeyecegi anlamina gelmektedir.Derleme zamani hatasi aliriz.
public **** 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. Serilestirme konusuna cooook sonraki derslerde gelicem insallah omrum yeterse
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. Threadler konusuna serilestirme konusundan sonra gelecegim insallah.

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 **** main(String[] args) {
System.out.println(var1++);
method1();
}

public static **** method1(){
System.out.println(++var1);
}
}​
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.