OCP-I Chapter2 Java Building Blocks-II

Literal'lerin(Değişmezler) Yazımı

Kodun içinde gördüğümüz sayısal ifadelere literal denir. Sayısal değerleri illa decimal(10) tabanda yazmamıza gerek yoktur. Binary(2), octal(8) veya hexadecimal(16) tabanda da yazabiliriz.

Bir sayı eğer

  • Sadece 0 ve 1 değerlerinden oluşmuşsa ve 0b veya 0B ön eki ile başlıyorsa o sayı binary(2 lik) tabandadır.
  • Sadece 0-9 aralığında numeric değer ve A ile F arasında harf değerinden oluşuyorsa ve 0X ile başlıyorsa hexadecimal(16 lık) tabandadır.
  • Sadece 0-7 aralığında numeric değer alabiliyorsa octal(8 lik) tabandadır.

Sayısal değerleri okunabilirlik açısından basmakları arasına _ koyarak ifade edebiliriz. 1_234_345_234 gibi. Yalnızca başa,sona ve ondalık değerin başına ve sonuna konulmaz.

Java'da Referans Tipleri

Oluşturduğumuz nesnelerin hafızadaki adreslerini tutan değerlere o nesnenin referansı denir. C dilinde verilerin hafızadaki fiziksel adreslerini bilebiliyorduk fakat Java buna izin vermez. Aynı tipteki nesneler arasında referans atamsı olabilir. new anahtar kelimesi ile yeni oluşturulan nesnelere atanabilir.

String text=new String("Hello from Mr Robot");

Kod örneğimizde text ifadesi yeni oluşturulan String nesnesinin referansıdır.

String text=new String("Hello from Mr Robot");
text=new String("Good Bye from Mr Robot");

text referansına aynı türden oluşturduğumuz başka bir nesnenin fiziksel adresini bağladık.

String hello=new String("Hello from Mr Robot");
String goodBye=new String("Good Bye from Mr Robot");
hello=goodBye;

Burada da hello referansına goodBye referansını atadık yani artık her iki referansta new String("Good Bye from Mr Robot"); ifadesi ile oluşan nesneyi refere eder.

Primitiv türlerin aksine referans değerlere null değeri vererek hafızadaki işaret ettiği nesne ile bağını keseriz ve bu ilgili nesne artık Garbage Collector'ın ilgi sahasına girer.

Referans türler vasıtasıyla refere ettikleri nesnenin üyelerine erişebiliriz. Fakat primit türlerde böyle bir durum söz konusu değildir.

Java Variables (Değişkenler)

Tüm diler de olduğu gibi Java dilinde de hafızada veri saklamak için değişkenler kullanılır. Aşağıda String, int ve long türünde 3 farklı değişken tanımı vardır.


String sValue="I am a String value";
int iValue=21;
long lValue=232L;

Yukarıdaki kodda sValue,iValue ve lValue bizim değişkenlerimizdir ve sahip oldukları veri tipinin kapasitesi miktarınca hafızada alana sahiptirler.

Naming Conversion

Java'da sınıflara değişkenlere metotlar vs. isim verirken şunlara dikkat etmemiz gerekir.

  • Bir harf yada $ veya _ (Java 9 dan beri _ ye izin yok.) ile başlayabilir.
  • Sayı ile başlayamaz fakat bitebilir.
  • Java keywordlerden biriyle aynı isme sahip olamaz.
  • goto ve const Java'da olamamasına rağmen reserved word olarak Java tarafından ayrılmıştır.
  • true,false ve null reserved değil literaldir bu yüzden kullanılmazlar.

Java'da isimlendirme yaparken aşağıdaki stillerden birini kullanabiliriz.

  • Camel Case
    • myVariableName
  • Snake Case
    • my_variable_name
  • Kebab Case
    • my-variable-name
  • Pascal Case
    • MyVariableName

Java'da ayniçerisindeçerisnde birden çok değişken tanılanabilir ve değer ataması yapılabilir tabi ki değişkenler aynı türde olmak koşuluyla.

int weight,height,age;
String country="Turkey",language="Turkish";
String city , int code; // DOESNT COMPILE

Değişkenlere İlk Değer Atama (Initializing Variables)

Yerel(Local) Değişkenler

Java'da bir kod bloğu, constructor ya da metot içerisinde tanımlanan değişkenlerdir. Değer ataması yapılmadan kullanılamaz çünkü default değerlere sahip değillerdir. Atama yapılmadan kullanılmaları halinde derleyici hata verir.

public int fire() {
int power=100;
int bullet;
int fire=power+bullet;// DOESNT COMPILE
// bullet değişkeni initialize edilmediği için derleyici hata verir.
return fire;
}

Metotlara ve constructorlara geçirilen parametreler öncelikle initialize edilmelidir.

Class ve Instance Değişkenleri

Instance değişkenleri field olarak adlandırılırlar. Sınıftan üretilen her nesne bu field'lara sahiptir fakat aynı değere sahip olmayabilirler. Class değişkenlerine ise nesne oluşturmadan erişmek mümkündür. Çünkü static olarak tanımlanırlar. Bu iki değişkende default değere sahiptir ve kullanacağımız zaman ilk değer ataması yapmamıza gerek yoktur.

Defult değerler

  • String- null
  • byte,int,long,shor - 0
  • char - '\u0000' (NULL)
  • boolean - false
  • double , float - 0.0

Java'da var Kullanımı

Java'da var 'ın formal ismi Local variable interface type olarak geçmektedir. Yalnızca local değişkenlerde kullanılır. Sınıf değişkenlerinde kullanımı derleme hatasına sebep olur.

public String getNameAndAge() {
var name="MrRobot";
var age="20"
return name+age;
}

var ile tanımlama yapılan ilk satırda derleyici atanan değerin tütüne bakarak değişkenin tipini belirler ve değişkene yapılacak sonraki değer atamalarında bu tipi zorunlu tutar. Farklı bir türde değer ataması yapılırsa derleyici hata verir. Burada JS deki var yapısından farkı ortaya çıkar.

var ile tanımlanan değişkenin tipi sonradan değiştirilemez fakat değeri değiştirilebilir.

Not: Eğer var kullanacaksak tanımladığımız satırda değer ataması yapmalıyız çünkü daha sonra değer ataması yaparsak derleyici değişken tipini bilmediği için hat verir.

Not: Tek satırda birden çok değişken tanımlana ifadelerde kullanılmaz.

Not: var değişkene null ataması ilk satırda yapılmaz null ataması ilk satır harici ve pirimitive olmayan var değişkenlerde yapılır. Çünkü pirimitivlere null ataması yapılmaz.

Not: var isminde bir değişken tanımlayabiliriz çünkü reserved word değildir fakat bir type yani sınıf, interface ya da enum tanımlayamayız çünkü var Java'dfa reserved typedır.

Variable Scope

public double calculateBMI(int height , int weight) {
double bmi=weight/height*height;
return bmi;
}

Yukarıdaki metodda bmi,height ve weight local değişkenlerdir. Ve metot scope'una shiptirler.

Metot içerisndeki başka kod blokları kendi scopuna sahiptirler. Her {...} arası bir scoptur. Scopun dışındaki bir değişkene erişmek istediğimizde derleyici Cannot find symbol hatası verir.

Class Scope

Instance variable nesne içerisinde tanımlıdır tanımlandığı yerde başlar ve nesnenin yaşam süresince o da yaşar. Sınıf değişkenleri ise tanımlandığı yerde başlar ve programın yaşam süresince hayattadır.

Nesneleri Yok Etme

  • Garbage Collection Java tarafından otomatik yapılır.
  • Tüm Java nesneleri heap bellekte saklanır.
  • Çöp toplama programcının kontrolunde olsa programcı hafızayı kontrol etmek zorundadır çünkü eğer heap dolarsa program durur. OutOfMemory Exception.
  • Ya da programcı referanssız nesneleri silmezse hafızada sensitive veriler kalabilir bu da güvenlik açıklarına sebep olur.
  • Çöp toplama için birçok algoritma mevcuttur.
  • System.gc(); metodu garbage collectoru çağırır fakat çöp toplama işlemini garanti etmez kontrol her zaman JVM dedir.
  • JVM OutOfMemory olmadan çöp toplamayı hedefler.