Java'da Dönüşümler ve Promosyonlar
Bu yazıda ilkel dönüşümü tartışacağız .
· Tür Dönüştürme
∘ Örtük tür dönüştürme
∘ Açık tür dönüştürme
· İfadelerde Otomatik Tür Yükseltme
· Tür Atma ve Tür Zorlama arasındaki fark
Bilgisayar biliminde, tür dönüştürme , tür atama , tür zorlama ve tür hokkabazlığı , bir ifadeyi bir veri türünden diğerine değiştirmenin farklı yollarıdır. Bir tamsayı değerinin kayan noktalı bir değere dönüştürülmesi veya bunun bir dize olarak metinsel gösterimi ve bunun tersi bir örnek olabilir. Tür dönüştürmeleri, tür hiyerarşilerinin veya veri temsillerinin belirli özelliklerinden yararlanabilir. Bir tür dönüştürmenin iki önemli yönü, örtülü (otomatik olarak) veya açık olarak gerçekleşip gerçekleşmediği ve temel veri temsilinin bir temsilden diğerine dönüştürülüp dönüştürülmediği veya belirli bir temsilin yalnızca yeniden yorumlanıp yorumlanmadığıdır.başka bir veri türünün temsili olarak. Genel olarak, hem ilkel hem de bileşik veri türleri dönüştürülebilir.
Her programlama dilinin, türlerin nasıl dönüştürülebileceğine ilişkin kendi kuralları vardır. Güçlü yazım özelliğine sahip diller tipik olarak çok az örtük dönüştürme yapar ve temsillerin yeniden yorumlanmasını engellerken, zayıf yazım özelliğine sahip diller veri türleri arasında birçok örtük dönüştürme gerçekleştirir. Zayıf yazım dili, genellikle derleyicinin bir veri öğesini farklı temsillere sahip olarak keyfi bir şekilde yorumlamaya zorlamasına izin verir - bu, bariz olmayan bir programlama hatası veya temeldeki donanımla doğrudan ilgilenmek için teknik bir yöntem olabilir.
Java, boolean, char, int, unsigned int,signed int, float, double, long vb. gibi diğer dinamik dillerde olduğu gibi toplamda her veri türünün bellekte depolanırken farklı alan edindiği 7 tür sağlayarak çeşitli veri türleri sağlar.
Tip Dönüşümü
Daha önce programlama deneyiminiz varsa, bir türdeki bir değeri başka bir türdeki değişkene atamanın oldukça yaygın olduğunu zaten biliyorsunuzdur. İki tür uyumluysa, Java dönüştürmeyi otomatik olarak gerçekleştirir (tür dönüştürme) . Örneğin, uzun bir değişkene bir int değeri atamak her zaman mümkündür. Ancak, tüm türler uyumlu değildir ve bu nedenle, tüm tür dönüştürmelerine dolaylı olarak izin verilmez. Örneğin, çiftten bayta tanımlanmış otomatik bir dönüştürme yoktur . Neyse ki, uyumsuz türler arasında bir dönüşüm elde etmek hala mümkündür. Bunu yapmak için, açık bir performans sergileyen bir cast kullanmanız gerekir.Uyumsuz türler arasında dönüşüm. Hem otomatik hem de genişleyen tip dönüşümlerine ( tip zorlama , tip hokkabazlığı ) ve daraltan veya açık Dönüşüm'e ( tip döküm ) bakalım .
Gördüğünüz gibi, değişken üzerinde olduğu gibi sayısal bir değer üzerinde de dönüşüm gerçekleştirmek mümkündür. Gereksiz yayınlar ekleyebileceğinize dikkat edin; örneğin, derleyici gerektiğinde otomatik olarak bir int değerini uzun bir değere yükseltir. Ancak, bir noktaya değinmek veya kodunuzu açıklığa kavuşturmak için gereksiz atamalar kullanmanıza izin verilir. Diğer durumlarda, yalnızca kodun derlenmesini sağlamak için bir atama gerekli olabilir.
C ve C++'da tür dönüştürme bazı baş ağrılarına neden olabilir. Java'da, daraltma dönüştürmesi denen bir işlem gerçekleştirdiğinizde (yani, daha fazla bilgi tutabilen bir veri türünden çok fazla bilgi tutamayan bir veri türüne geçtiğinizde) dışında, dönüştürme güvenlidir. bilgileri kaybetme riski. Burada derleyici sizi bir cast (tip dökümü) kullanmaya zorlar ve aslında "Bu yapılması tehlikeli bir şey olabilir - yine de yapmamı istiyorsanız, dönüşümü açık hale getirmelisiniz" der.” Genişleyen bir dönüştürmede, bir dönüştürmeye (açık atama) gerek yoktur, çünkü yeni tür, eski türden bilgiyi fazlasıyla tutacaktır, böylece hiçbir bilgi kaybolmaz. Java, herhangi bir ilkel türü, herhangi bir ilkel türe dönüştürmenize izin verir, ancak herhangi bir döküme izin vermeyen boolean dışında. Sınıf türleri, atamaya izin vermez. Birini diğerine dönüştürmek için özel yöntemler olmalıdır. (…)
Örtülü tür dönüştürme
'Otomatik veya evli tip dönüştürme' olarak da bilinir.
- Kullanıcıdan herhangi bir harici tetikleyici olmaksızın derleyici tarafından kendi başına yapılır.
- Genellikle bir ifadede birden fazla veri türü olduğunda gerçekleşir. Bu durumda, veri kaybını önlemek için tür dönüştürme (tür yükseltme) gerçekleşir.
- Değişkenlerin tüm veri türleri, en büyük veri türüne sahip değişkenin veri türüne yükseltilir.
bool -> char -> short int -> int ->
unsigned int -> long -> unsigned ->
long long -> float -> double -> long double
Örtük dönüştürmelerin bilgi kaybetmesi mümkündür, işaretler kaybolabilir (signed dolaylı olarak unsigned'e dönüştürüldüğünde) ve taşma meydana gelebilir (long long örtük olarak float'a dönüştürüldüğünde).
bazen bu tür bir dönüşüme ceorcion türü diyoruz .
Java'da, bir tür nesneyi benzer içeriğe sahip farklı türdeki başka bir nesneye dönüştürme mekanizması zorlama olarak bilinir. Diğer bir deyişle zorlama, bir veri türünün başka bir veri türüne dönüştürülmesi işlemidir diyebiliriz. Daha spesifik bir şekilde, örtük dönüştürmeye zorlama denir . Tip zorlama olarak da bilinir .
ceorcion türünde , bir veri türü, derleyici zamanında bir derleyici tarafından otomatik olarak başka bir veri türüne dönüştürülür. ceorcion türünde , hedef veri türü kaynak veri türünden daha küçük olamaz, bu nedenle buna genişletme dönüştürmesi de denir. Bir diğer önemli husus ise sadece uyumlu veri tiplerine uygulanabilmesidir.
Tip Ceorcion örneği –
int x=30;
float y;
y=x; // y==30.000000.
Java, verileri otomatik olarak düz veya kesikli olarak okların yönünde zorlar. Örneğin:
Noktalı bir oku çaprazlayan zorlamalara izin verilir ancak kesinlik kaybına neden olabilir. Bu, dönüştürülen değerin başlangıç değerine eşit olmayabileceği anlamına gelir. Örneğin:
Herhangi bir ifade, verileri okların yönüne karşı zorlamaya çalışırsa derleyici bir hata oluşur.
Java'da örtük tip dökümünün bir örneğine bakalım.
Burada, basit bir atama operatörü kullanarak bir int değerini uzun bir değere ve son olarak da bir çift değere dönüştüreceğiz :
public class Main {
public static void main(String[] args) {
int a = 20;
long b = a; //implicit casting from int to long data type
double c = b;
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
} // implicit casting from long to double data type
20
20
20.0
Başka bir deyişle, "tür dönüştürme", bir türün genel olarak değiştirilmesi sürecini ifade ederken, tür zorlaması daha spesifik olarak bir türün örtük dönüştürülmesini ifade eder . Tür zorlamayı ayrıca iki türe ayırabiliriz - programcı kontrollü ve derleyici kontrollü (bazen hokkabazlık olarak anılır ).
Açık tip dönüştürme
Otomatik tür dönüştürmeleri yardımcı olsa da, tüm ihtiyaçları karşılamazlar. Örneğin, bir bayt değişkenine bir int değeri atamak isterseniz ne olur? Bir bayt bir int'den küçük olduğu için bu dönüştürme otomatik olarak gerçekleştirilmeyecektir. Bu tür dönüştürmeye bazen tip atama denir ve kullanıcı tanımlıdır.
Bu işleme daraltma türü dönüştürmesi de denir, çünkü değeri hedef türe sığdırmak için açıkça daraltıyorsunuz.
Uyumsuz iki tür arasında bir dönüştürme oluşturmak için, bir tür dökümü kullanmalısınız. Bir döküm, yalnızca açık bir tür dönüşümüdür.
Java'da, bir atama işleci () kullanılarak yapılabilir :
Bu, gerekli türü parantez içindeki ifadenin önünde açıkça tanımlayarak yapılır.
Bu genel forma sahiptir:
(target-type) expression
Burada, hedef tipi, belirtilen değerin dönüştürülmesi istenen tipi belirtir. Örneğin, aşağıdaki parça bir int'yi byte'a çevirir . Tamsayının değeri bir byte aralığından büyükse , modulo (bir tamsayının the ile bölümünden kalan) byte'ın aralığında azaltılacaktır.
int a;
byte b; // …
b = (byte) a;
Aşağıdaki program, dönüştürme gerektiren bazı tür dönüşümlerini göstermektedir:
// Demonstrate casts.
class Conversion {
public static void main(String args[]) {
byte b;
int i = 257;
double d = 323.142;
System.out.println("\nConversion of int to byte.");
b = (byte) i;
System.out.println("i and b " + i + " " + b);
System.out.println("\nConversion of double to int.");
i = (int) d;
System.out.println("d and i " + d + " " + i);
System.out.println("\nConversion of double to byte.");
b = (byte) d;
System.out.println("d and b " + d + " " + b);
}
}
Conversion of int to byte. i and b 257 1
Conversion of double to int. d and i 323.142 323
Conversion of double to byte. d and b 323.142 67
Java'da açık atama örneğine bakalım:
public class Main {
public static void main(String args[]) {
double d = 57.17;
int i = (int)d; // Explicit casting from long to int data type
System.out.println(d);
System.out.println(i); //fractional part lost
}
}
57.17
57
57
İfadelerde Otomatik Tip Yükseltme
Tür yükseltme, Java programlamasında yaygın bir durumdur ve otomatik tür geliştirme kullanılarak ilkel veri türleriyle otomatik olarak elde edilebilir. Otomatik veri türü tanıtımı olarak da adlandırılır.
Bildiğiniz gibi, atamalara ek olarak, belirli tür dönüşümlerinin gerçekleşebileceği başka bir yer daha var: ifadelerde.
Aşağıda, olası promosyon türlerinin şematik bir gösterimi bulunmaktadır:
Bir int'den küçük (yani, char, byte veya short) ilkel veri türleri üzerinde herhangi bir matematiksel veya bitsel işlem gerçekleştirirseniz, bu değerlerin işlemler gerçekleştirilmeden önce int'e yükseltileceğini ve sonuçta ortaya çıkan sonucun int'e yükseltileceğini keşfedeceksiniz. değer int türünde olacaktır. Bu nedenle, daha küçük türe geri atamak istiyorsanız, bir alçı kullanmanız gerekir. (Ve daha küçük bir türe geri atadığınız için bilgi kaybediyor olabilirsiniz.) Genel olarak, bir ifadedeki en büyük veri türü, o ifadenin sonucunun boyutunu belirleyen veri türüdür; bir float ile bir double'ı çarparsanız, sonuç double olur; bir int ve bir long eklerseniz, sonuç uzun olacaktır.
Daha fazlasını anlamak için:
aşağıdakileri göz önünde bulundur. Bir ifadede, bir ara değer için gereken kesinlik bazen işlenenlerden herhangi birinin aralığını aşabilir. Örneğin, aşağıdaki ifadeyi inceleyin:
byte a = 40;
byte b = 50;
byte c = 100;
int d = a * b / c;
Otomatik yükseltmeler ne kadar yararlı olsalar da kafa karıştırıcı derleme zamanı hatalarına neden olabilirler. Örneğin, görünüşte doğru olan bu kod bir soruna neden olur:
byte b = 50;
b = b * 2; // Error! Cannot assign an int to a byte!
Taşmanın sonuçlarını anladığınız durumlarda, örneğin açık bir atama kullanmalısınız.
byte b = 50;
b = (byte)(b * 2);
Otomatik tür yükseltme kuralları
Doğru sonuçlara ulaşmak için Java'da ifadeler yürütülürken tür yükseltme için aşağıdaki kurallara uyulmalıdır:
- byte , short ve char türündeki tüm değişkenler, otomatik tür olarak int'e yükseltilmelidir .
- Bir işlemde yer alan herhangi bir değişken uzunsa , işlemin sonucu da uzun olmalıdır .
- Bir işlemde yer alan herhangi bir değişken float ise , işlem sonucu da float olmalıdır .
Java'daki sayısal yükseltme kurallarını gösteren bazı Java örnekleri görelim.
1- İşlenenlerden biri çift olduğunda.
public class PromotionExample {
public static void main(String[] args) {
int i = 30;
double d = 2.5;
double result = i * d;
System.out.println("Result is- " + result);
}
}
// output :
// Result is- 75.0
2- Operandlardan biri float olduğunda.
public class PromotionExample {
public static void main(String[] args) {
short s = 4;
int i = 30;
float f = 6.75f;
float result = (s+i) * f;
System.out.println("Result is- " + result);
}
}
//output
// Result is- 229.5
3- Operandlardan biri float iken sonucu int'e atamaya çalışmak.
public class PromotionExample {
public static void main(String[] args) {
byte a= 100;
byte b= 50;
int i= 80;
float f = 80;
result = f/i *b; // line 6
}
}
error line 6
Aşağıda verilen Tip döküm ve Tip Zorlama arasındaki farkı görelim:
- Tip atamada, bir veri tipi bir programcı tarafından döküm operatörü kullanılarak başka bir veri tipine dönüştürülür. Tip zorlamada ise, bir veri tipi bir derleyici tarafından başka bir veri tipine dönüştürülür.
- Tip belirleme uyumlu veri tiplerine uygulanabileceği gibi uyumsuz veri tiplerine de uygulanabilirken tip zorlama sadece uyumlu veri tiplerine uygulanabilir .
- Tip atamada bir veri tipini başka bir veri tipine çevirmek için döküm operatörüne ihtiyaç duyulurken, tip zorlamada döküm operatörüne gerek yoktur.
- Tip dönüştürmede ( açık tip dönüştürme), veri tipi başka bir veri tipine dönüştürülürken hedef veri tipi kaynak veri tipinden daha küçük olabilir . kaynak veri türünden daha küçüktür.
- Tip dökümü program tasarımı sırasında programcı tarafından yapılır. Tip dönüştürme ( impcit type convertion) ise derleme zamanında yapılır.
- Tür belirleme aynı zamanda daraltma dönüştürmesi olarak da adlandırılır çünkü burada hedef veri türü kaynak veri türünden daha küçük olabilir . kaynak veri türü.
- Tip atama, kodlama ve rekabetçi programlama işlerinde sıklıkla kullanılır. Oysa tip zorlama ( imprecit type convertion ) kodlama ve rekabetçi programlamada yanlış cevaba neden olabileceğinden daha az kullanılır.
- Tip döküm daha verimli ve güvenilirdir. Tip zorlama ( impcit tip dönüştürme) ise daha az verimli ve daha az güvenilirdir.
Yayınımızı takip ederek destek olun
Ayrıca aşağıdaki makalelere bakın.
2023 React JS Trendlerini İzlemek İçin Tıklama hırsızlığı ve önleyici tedbirleri SpringBoot ile Splunk Entegrasyonu Bölüm — 1 Kodlama: Javascript'te İki Dizinin Anagram Olup Olmadığını Kontrol Edin Java Neden Gezegendeki En Sevilen Programlama Dili Java'daki Yöntemleri Anlayın 5 Ortak JavaScript Sorusu: Spark Mimarisine Giriş 25. En Büyük İkili Arama Alt Ağacı (BST)
![Bağlantılı Liste Nedir? [Bölüm 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































