Java Primitive , Literals, Referans Tipler , var Kullanımı

Java Primitive , Literals, Referans Tipler , var Kullanımı

Arkadaşlar merhaba,

Bu yazımızda java'da primitive (İlkel) tipler ve referans tiplere ,tanımlayıcılara ve değişken tanımlarına göz atacağız.

Primitive Types (İlkel Tipler)

İlkel tipler 8 tanedir. Bit sayısı, değişkeniniz için ne kadar bellek ayrılacağını hesaplarken Java tarafından kullanılır.

  • boolean true or false => true

  • byte 8-bit integral value => 123

  • short 16-bit integral value => 123

  • int 32-bit integral value => 123

  • long 64-bit integral value => 123L

  • float 32-bit floating-point value => 123.45f

  • double 64-bit floating-point value => 123.456

  • char 16-bit Unicode value => 'a'

float ve double türleri, kayan noktalı (ondalık) değerler için kullanılır.

Bir float, sayının ardından f-F eklendiği taktirde, java bunun bir float değer olduğunu bilir.

Byte, short, int, and long tipleri tam sayı olarak kullanılır.

Her sayısal tür daha küçük türden iki kat daha fazla bit kullanır. Örneğin; short byte’ın kullandığı 2 katı kadar bit kullanır.

Bir karakter sabitesi, iki tane tekli kesme "’" işareti arasında ifade edilir.

char dışında diğer bütün 6 sayısal tip de imzalıdır (signed), pozitif ve negatif değerler alabilir.

char, karakter tipidir ve her karakterin sıfır ya da bir pozitif tam sayı değeri vardır.

Sayısal olmayan tek tip boolean'dır. Mantıksal bir tiptir.

Tam sayılar: byte, short, int ve long'dur.

Gerçek sayılar: ise float ve double'dır.

İmzalı (Signed) ve İmzasız(Unsigned) - Short ve Char

Birincil fark, short işaretli olmasıdır; bu, aralığını pozitif ve negatif tam sayılara bölündüğü anlamına gelir.

char imzasızdır.Bu, aralığın 0 dahil pozitif olduğu anlamına gelir.

Bu nedenle, char short'dan daha yüksek bir pozitif sayısal değer tutabilir, ancak herhangi bir negatif sayı tutamaz.

Derleyici, burada gösterildiği gibi bazı durumlarda bunların birbirinin yerine kullanılmasına izin verir.

short bird = 'd';
char mammal = (short) 83;

System.out.println(bird); // Prints 100
System.out.println(mammal); // Prints S

short veya char aralığı dışında bir değer ayarlamaya çalışırsanız, derleyici bir hata bildirir.

short reptile = 65535; // DOES NOT COMPILE 
char fish = (short)-1; // DOES NOT COMPILE

Literals

Kodda bir sayı varsa, buna literal değer denir. Varsayılan olarak Java, sayısal bir hazır bilgiyle bir int değeri tanımladığınızı varsayar. Aşağıdaki örnekte, listelenen sayı bir int maximum değerinden daha büyüktür.

long max = 3123456789; // DOES NOT COMPILE

Bunun long olduğunu bildirmek için sayının sonuna L yada l ekleriz.

long max = 3123456789L;

Değişmezler ve Alt Çizgi Karakteri (Literals and the Underscore Character)

Bir sabit değerin başlangıcı, sonu ve bir ondalık noktadan hemen önce veya sonrası hariç herhangi bir yere alt çizgi ekleyebilirsiniz.

int million1 = 1000000;

int million2 = 1_000_000;

double annoyingButLegal = 2_00_0.0_0;

double reallyUgly = 2__________4; // Also compiles
double notAtStart = _2000.00;  // DOES NOT COMPILE
double notAtEnd = 2000.00_;  // DOES NOT COMPILE
double notByDecimal = 3000_.00;  // DOES NOT COMPILE

Reference Types

Bir referans tip bir objenin örneğine yani instance’na başvurur.

Primitive tiplerin aksine nesnenin değerini tutmaz.

Onun yerine bir referans nesnenin bulunduğu bellek adresini depolayarak nesneye işaret eder. Java fiziksel bellek adresinin ne olduğunu öğrenmenize izin vermez.

Referans yalnızca nesneye atıfta bulunmak için kullanılabilir

Referans türleri referansın null olmadığı varsayılarak metotları çağırmak için kullanılabilir.

Primitive tiplerin üzerlerinde bildirilmiş metotları yoktur.

String reference = "Selam";
int leng = reference.length();
int bad = leng.length();  // // DOES NOT COMPILE

Bir int primitive olduğu için length gibi hiçbir method yoktur.

Değişken Tanımları (Declaring Variables)

Değişken, verileri depolayan bir bellek parçasının adıdır.

Bir değişken tanımladığınızda, ona bir isim vererek değişken tipini belirtmeniz gerekir.

Örneğin, aşağıdaki kod iki değişken bildirir. Bir tanesi name olarak adlandırılmıştır ve String türündedir. Diğeri ise age olarak adlandırılır ve int türündedir.

String name;

int age;

Artık bir variable tanımladığımıza göre ona bir değer verebiliriz.Buna değişken başlatma (initialize a variable )denir.

Bir değişkeni başlatmak için, değişken adını ve ardından eşittir işaretini ve ardından istediğiniz değeri yazmanız yeterlidir:

name = "Umut";

age = 29;

Identifiers

  • Identifier, bir değişkenin, metodun, sınıfın, interface’in veya paketin adıdır.
  • Tanımlayıcılar bir harf, bir $ sembolü veya bir _ sembolü ile başlamalıdır.
  • Tanımlayıcılar sayılar içerebilir ancak bunlar ile başlamaz.
  • Java 9'dan itibaren, tanımlayıcı olarak tek bir alt çizgiye _ izin verilmez.

THIS_IS_A_CONSTANT gibi sabit statik değerler genellikle bu şekilde yazılır.

Color.RED, Color.DARK_BLUE gibi enum değerleride bu şekilde yazılır.

Örnek;

long okidentifier;
float $OK2Identifier;
boolean _alsoOK1d3ntifi3r;
char __SStillOkbutKnotsonice$;

Geçersiz Tanımlar;

int 3DPrintClass; => tanımlayıcılar bir sayı ile başlayamaz.
byte hollywood@vine; => @ işareti bir harf, rakam, $ veya _ değildir
String *$coffee; => * karakteri bir harf, rakam, $ veya _ değildir.
double public; => public ayrılmış (reserved) bir kelimedir.
short _ ; => tek bir alt çizgiye izin verilmez.

Aynı satırda birden çok variable yazılabilir. Aynı türde olmaları gerekir.

void multiVariable() {
   String s1, s2;
   String s3 = "yes", s4 = "no";
}

Örnekte, başlatılmış (initilazed) iki değişkenimiz var: s3 ve s4. Diğer iki değişken bildirilmiş olarak kalır ancak henüz başlatılmamıştır.

void multiVariable() {
   int i1, i2, i3 = 0;
}

Üç değişken bildirildi: i1, i2 ve i3. Ancak, bu değerlerden yalnızca biri başlatıldı: i3.

Diğer ikisi bildirilmiş durumda ancak henüz başlatılmamış durumda. İşin püf noktası bu. Virgülle ayrılmış her snippet, kendine ait küçük bir bildirimdir. i3'ün başlatılması yalnızca i3 için geçerlidir. Aynı ifadede olmasına rağmen i1 veya i2 ile ilgisi yoktur. Başlatılıncaya kadar i1 veya i2'yi gerçekten kullanamazsınız.

int num, String value; // DOES NOT COMPILE

Örnekler;

    boolean b1, b2;
    String s1 = "1" , s2;
    double d1 , double d2; // virgül ile ayrıldığı için geçerli değil
    double d1, d2; // geçerlidir.
    int i1; int i2; // noktalı virgül ile ayrıldığı için geçerlidir.
    int i3; i4;  //noktalı virgül ile ayrıldığı için yeni değerin tekrar tipinin belirtilmesi gerekir. int i3 ;  int i4; gibi

var

var, Java 10 ile birlikte gelen yeni bir ayrılmış bir tür adıdır.

Yerel değişken oluşturmada kullanılır. var ile değişken oluşturulurken tip verilmesi gerekmez.

Java tip bilgisini ortamdan (context) çıkarır. Buna tip çıkarımı (type inference) denir.

  • Bir constructor, method veya initializer (başlatıcı bloğunda) yerel değişken olarak bir var kullanılabilir.
  • Constructor parametrelerinde, method parametrelerinde, instance variables'da veya sınıf değişkenlerinde bir değişken olarak kullanılamaz.
  • Var'ın değeri değişebilir, ancak türü değişmez.
  • Bir var, tür olmadan boş(null) bir değerle başlatılamaz.
  • Çok değişkenli bir bildirimde bir var'a izin verilmez. -Var, ayrılmış bir tür adıdır, ancak ayrılmış(reserved) bir kelime değildir, yani class, interface veya enum adı dışında bir tanımlayıcı olarak kullanılabilir.
  • class, interface, veya enum olarak kullanılamaz.
  • var ile tip değerini compile time'da atar.
String name;

public void ExamplesVar(var name)  // Cannot resolve symbol 'var'
{ 
  this.var = name; 
}

Bu özelliği kullanmak için primitive veya reference type yerine var yazmanız yeterlidir.

    public void whatTypeAmI(){
        var name = "Hello";
        var size = 7;
    }

tricky değişkeni bir instance variable'dır.

Yerel değişken türü çıkarımı (Local variable type inference), örnek değişkenlerle(instance variable) değil, yerel değişkenlerle (local variable) ile çalışır. Bu nedenle aşağıdaki kod çalışmayacaktır.

public class VarKeyword {
   var tricky = "Hello"; // DOES NOT COMPILE
}

var ile tip değerini compiler zamanında atar. Bu nedenle aşağıdaki örnekte önce int atanmış sonra String değerinde değer verildiği için hata fırlatır.

    public void varReassignment() {
        var number = 3;
        number = 2;
        number = "five";  // DOES NOT COMPILE
    }

Aşağıdaki örnekte byte short'a yükseltilir.Çünkü byte short'a sığacak kadar küçüktür.Depolanan değerin tipi short'dur.

Elemanın veri tipi byte olarak değişmedi değer değişebilir ama türü asla değişmez.

  public void exampleVar(){
     var apples = (short)10;
     apples = (byte)5;

   apples = 1_000_000;  // DOES NOT COMPILE

  }

Bir milyon, short aralığının çok ötesinde olduğundan, son satır derlenmiyor.Derleyici, değeri int olarak kabul eder ve elmalara atanamayacağını belirten bir hata bildirir.

Aslında, derleyicinin değişkeni gördüğünde gerçekte ne yaptığını gösteren örneği yeniden yazalım.

short apples = (short)10;
apples = (byte)5;

Ayrıca var tanımlanırken değişken adı ile başlatma değeri arasında bir satır ekleyebilirsiniz.

  public void breakingDeclaration() {
        var absurd
                = 1;
    }

Aşağıdaki örnekte question tanımlaması hatalıdır.local variable type inference için derleyicinin yalnızca bildirimi içeren satıra baktığını unutmayın.

public void varExample2(boolean check) {

  var question; // hatalıdır.

  question = 1;

  var answer; // değer atanmadığı için derlenmez

}

Method örneği;

var yalnızca yerel değişken türü çıkarımı(local variable type inference) için kullanılır !

public int varMethodExample(var a, var b) {  // DOES NOT COMPILE
  return a + b;
}

Çoklu tanımlama örneği;

Başka bir deyişle, Java birden çok değişken bildiriminde var'a izin vermez.

Ayrıca null olarak tanımlanamaz.

public void multiTypes() {

      int a, var b = 1;  // DOES NOT COMPILE

      var n = null;      // DOES NOT COMPILE

}

Aşağıdaki örnekte ise n, bir nesne olan String türünde olduğundan, sorunsuz derlenir.

Öte yandan, m türü bir boş değer atanamayan primitive bir int olduğu için satır m derlenmez.

 public void varAndNull() {

      var n = "myData"; // String bir nesne olduğu için derlenir.
      n = null;

       var m = 4;
       m = null; // DOES NOT COMPILE

}

Ayrıca tür belirtilirse bir var'ın boş bir değere başlatılabilir.

Tür sağlandığı için, derleyici tür çıkarımı uygulayabilir ve var değişkeninin türünü String olarak ayarlayabilir.

   var o = (String) null;