"Geliştiriciler sayıları tanımlayan sınıflar bulabildiğinden, gerçek geliştiriciler gibi yaratıcı olmaya karar verdiler."

"İlk olarak, Byte, Short, Integer, Long, Float ve Double'ın türetildiği soyut bir Number sınıfı buldular. Sayıları diğer sayısal türlere dönüştürmeye yardımcı olan yöntemleri var."

Number sınıfının yöntemleri
1
int intValue()
2
long longValue()
3
float floatValue()
4
double doubleValue()
5
byte byteValue()
6
short shortValue()

"Doğru. Ne de olsa şunu yazamazsın:"

Long x = 100000;
Integer y = (Integer) x;

"Evet, bu türler ilkel değil. Bu yüzden Number sınıfının yöntemlerini kullanıyoruz:"

Long x = 100000;
Integer y = x.intValue();

"Ama yine de dikkate alınması gereken birkaç şey var. Tamsayı bir int olmadığı için, Tamsayı nesneleri klasik «==» işleciyle karşılaştırılamaz."

İlkel türleri karşılaştırma
int x = 500;
int y = 500;
x == y; //true
İlkel olmayan türleri karşılaştırma
Integer x = 500;
Integer y = 500;
x == y; //false
x.equals(y); //true

"Kesinlikle. Nedense bunu hemen düşünmedim."

"Ama dahası var."

"Devrelerimi kısa devre yapıyorsun! Başka ne var?"

"Bir Integer değişkenine bir int değeri atadığımızda, Integer.valueOf yöntemi çağrılır:"

kod gerçekten ne oluyor
Integer x = 5;
Integer x = Integer.valueOf(5);

"Evet, bunu zaten yukarıdaki örnekten anladım."

"Ancak, valueOf işlevi her zaman yeni bir Tamsayı nesnesi oluşturmaz."

"Ee, 'her zaman değil' de ne demek?"

"-128 ile 127 arasındaki değerleri önbelleğe alır."

kod gerçekten ne oluyor Tanım
Integer x = 300;
Integer y = 300;
Integer z = 300;
Integer x = Integer.valueOf(300);
Integer y = Integer.valueOf(300);
Integer z = Integer.valueOf(300);
Değişken x, y ve z, farklı nesnelere referanslar içerir
Integer x = 100;
Integer y = 100;
Integer z = 100;
Integer x = Integer.valueOf(100);
Integer y = Integer.valueOf(100);
Integer z = Integer.valueOf(100);
x, y ve z değişkenleri aynı nesneye referanslar içerir.
Integer x = new Integer(10)
Integer y = new Integer(10)
Integer z = 10;
Integer t = 10;
Integer x = new Integer(10)
Integer y = new Integer(10)
Integer z = Integer.valueOf(10);
Integer t = Integer.valueOf(10);
z ve t değişkenleri aynı nesneye referanslar içerir.

"Yani durum şu:"

1)  «new Integer()» yazarsak, yeni bir nesne almamız garanti edilir.

2)  Açıkça veya otomatik kutulama aracılığıyla Integer.valueOf()'u çağırırsak, sayı bağımsız değişkeni -128 ile 127 arasındaysa, yöntem yeni bir nesne veya önbelleğe alınmış bir nesne döndürebilir.

"Önbellekten bir nesne döndürme yönteminin nesi bu kadar korkunç?"

"Boş ver. Sadece şunu bilmen gerekiyor ki bazen, hiç beklemediğin anda nesneler eşit olabilir. Eşit olan her şey karmaşıktır. İlkel ile ilkel olmayanı karşılaştırırsak, o zaman bunlar ilkel olarak karşılaştırılır:"

Karşılaştırma sorunu
int x = 300;
Integer y = 300;
Integer z = 300;

x == y; //true (comparison based on primitive value)
x == z; //true (comparison based on primitive value)
y == z; //false (comparison based on references)
Daha da ilginç bir örnek. Önbellek burada resme giriyor
int x = 100;
Integer y = 100;
Integer z = 100;

x == y; //true (comparison based on primitive value)
x == z; //true (comparison based on primitive value)
y == z; //true (comparison based on references; they point to the same object)
Ancak önbellek burada yer almıyor
int x = 100;
Integer y = new Integer(100);
Integer z = 100;

x == y; //true (comparison based on primitive value)
x == z; //true (comparison based on primitive value)
y == z; //false (comparison based on references; they point to different objects)

"Harika... Peki tüm bunları nasıl ezberleyeceğim?"

"Bunu ezberlemenize gerek yok. Sadece tüm bunların nasıl organize edildiğini ve bir ilkel ile onun ilkel olmayan muadili devreye girdiğinde gerçekte ne olduğunu anlamanız gerekiyor."

"Tamsayı sınıfının yöntemlerine de bakmanızı tavsiye ederim. Oldukça iyi ve kullanışlı birkaç yöntemi var. Hatta bir tanesini oldukça sık kullanmışsınız."

"Evet, hatırlıyorum. Integer.parseInt();"