İki Aile: İlkel Tipler ve Referanslar
Java'daki her değerin bir tipi vardır ve bu tip iki aileden birine girer. İlkel tipler ham bir değeri doğrudan tutar: bir sayı, tek bir karakter ya da bir doğru/yanlış. Referans tipleri ise bellekte başka bir yerde duran bir nesneye giden bir referansı (bir işaretçiyi) tutar: String, diziler ve sizin ya da kütüphanelerin tanımladığı her sınıf.
Bu ayrım önemlidir çünkü ilkel tipler hafiftir ve değer ile kopyalanır; referans değişkenleri ise paylaşılan nesnelere işaret eder. Sekiz ilkel tiple başlayın - bunlar diğer her şeyin üzerine inşa edildiği temeldir.
Sekiz İlkel Tip
Java'da tam olarak sekiz yerleşik ilkel tip vardır. Altısı sayı, biri karakter, biri booleandır:
Baştan dikkat edilmesi gereken birkaç şey: 2_000_000 içindeki alt çizgiler derleyicinin yok saydığı yalnızca görsel ayırıcılardır, L ve f sonekleri zorunludur (bununla ilgili daha fazlası aşağıda) ve char tek tırnak kullanırken bir String çift tırnak kullanır.
Sayısal Tip Seçmek
byte veya short'a neredeyse hiç ihtiyacınız olmaz - bunlar yalnızca çok büyük dizilerde bellek tasarrufu sağlar. Asıl kararlar tam sayılar için int/long ve ondalıklar için float/double arasındadır.
| Tip | Boyut | Ne zaman kullanılır |
|---|---|---|
int | 32 bit | Tam sayılar için varsayılan (~2,1 milyara kadar) |
long | 64 bit | ~2 milyarı aşan değerler: milisaniye zaman damgaları, dosya boyutları |
double | 64 bit | Ondalıklar için varsayılan - iyi hassasiyet |
float | 32 bit | Yalnızca bellek kısıtlıysa ve hassasiyetten ödün verilebiliyorsa |
Tuzak taşmadır. Bir int, aralığını aştığında sessizce başa sarar - hata yok, sadece yanlış bir sonuç:
maxInt + 1 ifadesi -2147483648 değerine taşar, çünkü her iki işlenen de int'tir ve sonuç da int olarak kalır. Bir tarafı önce long'a dönüştürmek, hesabı 64 bitte yapar. Bir değer büyük olabilecekse - özellikle 1970'ten bu yana geçen milisaniyeler - long'a başvurun.
Literaller ve Sonekleri
Çıplak bir sayı literalinin varsayılan bir tipi vardır ve bu insanları ısırır. 100 bir int'tir; 3.14 bir double'dır. Bir long ya da float literali yazmak için bir sonek eklemeniz gerekir:
8_000_000_000L ifadesinden L'yi çıkarın, kod derlenmez; çünkü literal, long değişkenine ulaşmadan önce int aralığını aşar. 0.5f ifadesinden f'yi çıkarın, Java bir double'ın dönüşüm olmadan bir float'a atanamayacağından şikayet eder. Sonek büyük/küçük harfe duyarsızdır, ancak büyük L kullanın - küçük l, tam olarak 1 rakamına benzer.
char Gizlenmiş Bir Sayıdır
Bir char, 16 bitlik bir Unicode kod birimi saklar; bu da onun aynı zamanda küçük, işaretsiz bir tam sayı gibi davrandığı anlamına gelir. Üzerinde aritmetik yapabilir ve bir dönüşümle ileri geri çevirebilirsiniz:
Bu, harfleri kaydırmak için arada bir kullanışlıdır, ancak metin için buna güvenmeyin - bunun için String vardır. char'ın tek tırnak ('A') kullandığını unutmayın; çift tırnak ("A") tek karakterlik bir String oluşturur ki bu tamamen farklı bir tiptir.
Varsayılan Değerler (ve Yerel Değişken Tuzağı)
İlk değer atamadığınız alanlar ve dizi elemanları makul bir varsayılan değer alır. Ancak bu yalnızca alanlar ve dizi yuvaları için geçerlidir: yerel değişkenler hiçbir varsayılan değer almaz ve bir değer atamadan önce birini kullanmak, çalışma zamanı sürprizi değil, bir derleme hatasıdır.
Bunun yerine main içinde int x; System.out.println(x); yazsaydınız, derleyici bunu "variable x might not have been initialized" diyerek reddederdi. Bu katılık bir avantajdır - çöp veri okumanızı engeller. Aklınızda tutulması gereken varsayılan değerler: sayısal tipler 0, boolean false, char ' ' ve her referans tipi null.
Sıradaki: Strings
String, en çok kullanacağınız referans tipidir: metin, birleştirilmiş değerler, kullanıcı girişi. Buradaki ilkel tiplerden farklı davranır: bir nesnedir, değişmezdir (immutable) ve dizeleri karşılaştırmanın kendine özgü tuzakları vardır. Bir sonraki sayfa bunu ele alıyor.
Sıkça Sorulan Sorular
Java'da kaç veri tipi vardır?
Java'da sekiz ilkel tip vardır: byte, short, int, long, float, double, char ve boolean. Geri kalan her şey - String, diziler ve herhangi bir nesne - bir referans tipidir. Yani yerleşik ilkel sayısı sekizde sabittir; referans tipleri ise sınırsızdır, çünkü siz (ve kütüphaneler) yeni sınıflar tanımlarsınız.
Java'da int ile long arasındaki fark nedir?
Her ikisi de tam sayı tutar ama int 32 bittir (aralık yaklaşık ±2,1 milyar), long ise 64 bittir (aralık yaklaşık ±9,2 kentilyon). Varsayılan olarak int kullanın; bir değer iki milyarı aşabilecekse long'a geçin: milisaniye cinsinden zaman damgaları, dosya boyutları, büyük sayaçlar. Bir long literali L soneki gerektirir, örneğin long big = 10000000000L;.
Java'da bir int'in varsayılan değeri nedir?
int türündeki bir alan varsayılan olarak 0 olur - ancak yalnızca alanlar ve dizi elemanları varsayılan değer alır. Bir long 0L, bir double 0.0, bir boolean false, bir char '\u0000' ve herhangi bir referans tipi null olur. Yerel değişkenler hiçbir varsayılan değer almaz - kullanmadan önce bir değer atamalısınız, yoksa kod derlenmez.