Tür Dönüşümü Ne Demektir
Java statik olarak türlenmiştir: her değerin bir türü vardır ve derleyici uyumsuz türleri sessizce karıştırmanıza izin vermez. Tür dönüşümü, bir değeri bir türden başka bir türe çevirme şeklinizdir — bazen Java bunu sizin için yapar, bazen de bunu açıkça istemeniz gerekir.
İki yön vardır. Daha küçük bir türden daha büyük bir türe geçmek (bir int'i bir double'a) güvenlidir ve otomatik gerçekleşir. Daha büyük bir türden daha küçük bir türe geçmek (bir double'ı bir int'e) veri kaybına yol açabilir, bu yüzden Java bunu bir dönüşümle açıkça belirtmenizi zorunlu kılar.
Genişletme: Otomatik Dönüşüm
Bir genişletme dönüşümü, bir değeri daha fazla yeri olan bir türe taşır. Hiçbir şey kaybolamaz, bu yüzden Java bunu dönüşüm gerektirmeden sizin için yapar:
int 7, bir double'a yerleşir ve 7.0 olur. Sayılar için genişletme sırası byte -> short -> int -> long -> float -> double şeklindedir; bu zincir boyunca soldan sağa atama yapmak asla dönüşüm gerektirmez. Aritmetikte türleri karıştırmanın çoğunlukla "kendiliğinden çalışmasının" nedeni budur — Java önce daha küçük işleneni genişletir.
Daraltma: Açık Dönüşüm
Diğer yöne — bir daraltma dönüşümüne — geçmek veri kaybına yol açabilir, bu yüzden hedef türü değerin önüne parantez içinde koymazsanız derleyici reddeder:
(int) pi dönüşümdür. Ne yaptığına dikkat edin: sıfıra doğru kırpar, yani ondalık kısmı basitçe atar. 3.9, 3 olur ve -3.9, -3 olur. Yuvarlamaz. Yuvarlamak istiyorsanız, bu farklı bir araçtır:
Bir dönüşümün kırptığını unutmak, yeni başlayanların en sık yaptığı hatalardan biridir — "yuvarlanmış" sayınız her zaman bir eksik çıkıyorsa, genellikle nedeni budur.
Tam Sayı Bölmesi Tuzağı
Bu tuzak herkesi bir kez yakalar. Her iki işlenen de int olduğunda, / operatörü tam sayı bölmesi yapar ve kalanı atar — bir double'a herhangi bir atama yapılmadan önce:
a / b, 7 / 2'dir, tamamen int aritmetiğiyle hesaplanır ve 3 verir. Sonradan double'a genişletmek yalnızca 3'ü 3.0'a çevirir — .5 zaten gitmiştir. Önce bir işleneni double'a dönüştürmek ((double) a / b) tüm ifadeyi kayan noktaya zorlar ve istediğiniz 3.5'i verir. Yalnızca bir tarafı dönüştürmeniz yeterli; Java diğerini eşleşecek şekilde genişletir.
Daraltma Taştığında
Bir dönüşüm, değerin sığıp sığmadığını kontrol etmez. Sığmazsa, bitler basitçe kesilir ve şaşırtıcı bir sonuç elde edersiniz — hata yok, uyarı yok:
300 bir byte'a sığmaz, bu yüzden üst bitler atılır ve 44 elde edersiniz. Bu "sessiz" veri kaybıdır — program sorunsuz çalışır ve yanlış bir cevap verir. Yalnızca değerin daha küçük türe sığdığından emin olduğunuzda daraltın.
Sayılarla Metinler Arasında Dönüşüm
Bir String bir nesnedir, sayı değildir, bu yüzden onu (int) ile dönüştüremezsiniz — bu bir derleme hatasıdır. Dönüşüm bunun yerine özel metotlar kullanır:
Metinden sayıya geçmek için Integer.parseInt / Double.parseDouble kullanılır. Metin geçerli bir sayı değilse (örneğin "hello"), bu metotlar bir NumberFormatException fırlatır. Sayıdan metne geçmek için String.valueOf(n) kullanın ya da basitçe "" ile birleştirin — çünkü n + "", int'i bir String'e zorlar. "5" + 1 (string "51" verir) ile 5 + 1 (6 verir) arasındaki farka dikkat edin; bir String işin içine girdiği an +, birleştirme anlamına gelir.
Nesneleri Dönüştürme
Dönüşüm yalnızca ilkel türlere değil, nesne referanslarına da uygulanır. Bir referansı, bir kalıtım zinciri boyunca ilişkili bir türe dönüştürebilirsiniz — bir üst türe genişletmek otomatiktir, geri daraltmak ise açık bir dönüşüm gerektirir ve yalnızca nesne gerçekten o türse güvenlidir:
Object o = "hello";
String s = (String) o; // OK: o gerçekten bir String'e işaret ediyor
Integer bad = (Integer) o; // derlenir, ancak çalışma zamanında ClassCastException fırlatır
İkinci dönüşüm derlenir ama çalışma zamanında bir ClassCastException ile patlar, çünkü nesne bir String'dir, Integer değil. Kalıtım ve çok biçimliliğe ulaştığınızda bununla gerçek anlamda tanışacaksınız; şimdilik, (Type) söz diziminin nesnelere uygulanan aynı fikir olduğunu bilmeniz yeterli.
Sonraki: if-else
Dönüşüm, değerleri yeniden şekillendirmenizi sağlar; bir sonraki adım, programınızın bu değerlere göre yollar arasında seçim yapmasını sağlamaktır. if-else deyimi, bir koşul doğru olduğunda bir bloğu, yanlış olduğunda başka bir bloğu çalıştırır — kodunuzun verdiği her kararın temelidir. Bir sonraki sayfa budur.
Sıkça Sorulan Sorular
Java'da tür dönüşümü nedir?
Tür dönüşümü, bir değeri bir veri türünden başka bir türe çevirmektir. Java küçük "genişletme" dönüşümlerini otomatik yapar (int'ten double'a gibi), ancak veri kaybına yol açabilecek bir "daraltma" dönüşümü (double'dan int'e gibi) açık bir dönüşüm gerektirir: int n = (int) 3.9;.
Java'da bir double nasıl int'e çevrilir?
Hedef türü değerin önüne parantez içinde yazın: int n = (int) 3.9;. Bu, sıfıra doğru kırpar (ondalık kısmı atar), bu yüzden 4 değil 3 elde edersiniz. Bunun yerine yuvarlamak için Math.round(3.9) kullanın; bu 4 döndürür.
Java'da bir String nasıl int'e çevrilir?
Bir String sayı değildir, bu yüzden onu (int) ile dönüştüremezsiniz. Bir int elde etmek için Integer.parseInt("42"), bir double için Double.parseDouble("3.14") kullanın. Metin geçerli bir sayı değilse, bu metotlar bir NumberFormatException fırlatır.