Hi! Ing wulangan kepungkur, kita ngrembug jinis primitif casting. Ayo kelingan sedhela apa sing dirembug.
Kita mbayangno jinis primitif (ing kasus iki, jinis numerik) minangka boneka nesting sing ukurane beda-beda miturut jumlah memori sing dikuwasani. Minangka sampeyan bakal ngelingi, nglebokake boneka sing luwih cilik ing sing luwih gedhe iku prasaja ing urip nyata lan ing program Java.
Coba conto liyane sing luwih menarik:

public class Main {
public static void main(String[] args) {
int bigNumber = 10000000;
short smallNumber = (short) bigNumber;
System.out.println(smallNumber);
}
}
Iki minangka conto konversi otomatis utawa widening . Iki kedadeyan dhewe, dadi sampeyan ora perlu nulis kode tambahan. Pungkasane, kita ora nindakake apa-apa sing ora biasa: kita mung nggawe boneka sing luwih cilik dadi boneka sing luwih gedhe. Ana prakara liyane yen kita nyoba ngelawan lan nyelehake boneka Rusia sing luwih gedhe dadi boneka sing luwih cilik. Sampeyan ora bisa nindakake ing urip nyata, nanging ing program sampeyan bisa. Nanging ana siji nuansa. Yen kita nyoba kanggo nyelehake int
ing short
variabel, iku ora dadi lancar kanggo kita. Sawise kabeh, short
variabel mung ngemot 16 bit informasi, nanging int
ana 32 bit! Akibaté, nilai liwati kleru. Compiler bakal menehi kesalahan (' Bung, sampeyan nindakake perkara sing curiga!'). Nanging yen kita kanthi tegas nuduhake jinis sing bakal diowahi nilai, mula bakal ditindakake lan nindakake operasi kasebut.
public class Main {
public static void main(String[] args) {
int bigNumber = 10000000;
bigNumber = (short) bigNumber;
System.out.println(bigNumber);
}
}
Iku mung sing ditindakake ing conto ing ndhuwur. Operasi kasebut ditindakake, nanging amarga short
variabel kasebut mung bisa nampung 16 saka 32 bait, nilai pungkasan bakal kleru lan entuk nomer -27008 . Operasi kasebut diarani konversi eksplisit, utawa narrowing .
Conto widening lan narrowing jinis referensi
Saiki ayo ngomong babagan operator sing padha ora ditrapake kanggo jinis primitif, nanging kanggo obyek lan variabel referensi ! Kepiye cara iki ing Jawa? Iku bener cukup prasaja. Ana obyek sing ora ana hubungane. Iku bakal logis kanggo nganggep padha ora bisa diowahi kanggo saben liyane, ora eksplisit utawa otomatis:
public class Cat {
}
public class Dog {
}
public class Main {
public static void main(String[] args) {
Cat cat = new Dog(); // Error!
}
}
Ing kene, mesthi, kita entuk kesalahan. Kelas Cat
lan Dog
ora ana hubungane karo saben liyane, lan kita durung nulis 'konverter' kanggo pindhah saka siji menyang liyane. Iku ndadekake pangertèn sing kita ora bisa nindakake iki: compiler ora idea carane ngowahi obyek iki saka siji jinis menyang liyane. Yen obyek-obyek kasebut ana hubungane, ya, iku masalah liyane! Hubungane kepiye? Ndhuwur kabeh, liwat warisan. Coba gunakake warisan kanggo nggawe sistem kelas cilik. Kita bakal duwe kelas umum kanggo makili kewan:
public class Animal {
public void introduce() {
System.out.println("I'm Animal");
}
}
Saben uwong ngerti yen kewan bisa didol (kewan) utawa alam bébas:
public class WildAnimal extends Animal {
public void introduce() {
System.out.println("I'm WildAnimal");
}
}
public class Pet extends Animal {
public void introduce() {
System.out.println("I'm Pet");
}
}
Contone, njupuk canines - kita duwe asu domestik lan coyote:
public class Dog extends Pet {
public void introduce() {
System.out.println("I'm Dog");
}
}
public class Coyote extends WildAnimal {
public void introduce() {
System.out.println ("I'm Coyote");
}
}
Kita khusus milih kelas paling dhasar supaya luwih gampang dingerteni. Kita ora mbutuhake lapangan, lan siji cara cukup. Ayo nyoba nglakokake kode iki:
public class Main {
public static void main(String[] args) {
Animal animal = new Pet();
animal.introduce();
}
}
Apa sampeyan mikir bakal ditampilake ing console? Apa introduce
metode kelas Pet
utawa Animal
kelas bakal dijaluk? Coba benerake jawaban sampeyan sadurunge nerusake maca. Lan iki asile! Aku Pet Kenapa kita njaluk sing? Kabeh iku prasaja. Kita duwe variabel induk lan obyek turunan. Kanthi nulis,
Animal animal = new Pet();
kita widened Pet
referensi lan diutus kanggo Animal
variabel. Kaya jinis primitif, jinis referensi kanthi otomatis ditambahake ing Jawa. Sampeyan ora perlu nulis kode tambahan supaya bisa kelakon. Saiki kita duwe obyek turunan sing ditugasake menyang referensi induk. Akibaté, kita bisa ndeleng manawa metode panggilan digawe ing kelas turunan. Yen sampeyan isih durung ngerti sebabe kode iki bisa digunakake, tulis maneh nganggo basa sing biasa:
Animal animal = new DomesticatedAnimal();
Ora ana masalah karo iki, ta? Bayangake yen iki urip nyata, lan referensi kasebut mung label kertas kanthi tulisan 'Animal'. Yen sampeyan njupuk potongan kertas kasebut lan dipasang ing kerah kewan apa wae, kabeh bakal bener. Sawise kabeh, kewan apa wae iku kewan! Proses mbalikke - mindhah wit warisan menyang turunane - nyepetake:
public class Main {
public static void main(String[] args) {
WildAnimal wildAnimal = new Coyote();
Coyote coyote = (Coyote) wildAnimal;
coyote.introduce();
}
}
Kaya sing sampeyan ngerteni, ing kene kita nuduhake kelas sing pengin diowahi dadi obyek. Kita sadurunge duwe WildAnimal
variabel, lan saiki duwe Coyote
, sing luwih murah ing wit warisan. Iku ndadekake pangertèn sing tanpa pratondo eksplisit compiler ora ngidini operasi kuwi, nanging yen kita nunjukaké jinis ing kurung, banjur kabeh bisa. 
public class Main {
public static void main(String[] args) {
Pet pet = new Animal(); // Error!
}
}
Compiler ngasilake kesalahan! Nanging kenapa? Amarga sampeyan nyoba nemtokake obyek induk menyang referensi turunan. Ing tembung liyane, sampeyan nyoba nindakake kaya iki:
DomesticatedAnimal domesticatedAnimal = new Animal();
Ya, bisa uga kabeh bakal bisa digunakake yen kita nemtokake kanthi jelas jinis sing arep diowahi? Sing makarya karo nomer - Ayo dadi nyoba! :)
public class Main {
public static void main(String[] args) {
Pet pet = (Pet) new Animal();
}
}
Pangecualian ing thread "utama" java.lang.ClassCastException: Animal ora bisa matak kanggo Pet Error! Compiler ora bengok-bengok ing wektu iki, nanging kita rampung karo pangecualian. Kita wis ngerti alasane: kita nyoba nemtokake obyek induk menyang referensi turunan. Nanging kenapa sampeyan ora bisa nindakake iku? Amarga ora kabeh Kewan iku Kewan Domestikasi. Sampeyan nggawe Animal
obyek lan nyoba nemtokake menyang Pet
variabel. A coyote uga Animal
, nanging dudu Pet
. Ing tembung liyane, nalika sampeyan nulis
Pet pet = (Pet) new Animal();
new Animal()
bisa makili kewan apa wae, ora mesthi kewan! Alamiah, variabel sampeyan Pet pet
mung cocok kanggo nyimpen Pets (lan turunane) lan dudu jinis kewan apa wae. Pramila pangecualian Jawa khusus, ClassCastException
, digawe kanggo kasus nalika ana kesalahan nalika casting kelas. Ayo dideleng maneh supaya luwih jelas. Referensi wong tuwa bisa nuduhake conto saka kelas turunan:
public class Main {
public static void main(String[] args) {
Pet pet = new Pet();
Animal animal = pet;
Pet pet2 = (Pet) animal;
pet2.introduce();
}
}
Contone, ing kene ora ana masalah. Kita duwe Pet
obyek sing dirujuk dening Pet
variabel. Mengko, Animal
referensi nuding obyek sing padha. Sawisé iku, kita ngowahi animal
menyang a Pet
. Ngomong-ngomong, kenapa iki bisa digunakake kanggo kita? Pungkasan kita entuk pangecualian! Amarga wektu iki obyek asli kita yaiku a Pet
!
Pet pet = new Pet();
Nanging ing conto pungkasan, iku Animal
obyek:
Pet pet = (Pet) new Animal();
Sampeyan ora bisa nemtokake obyek leluhur menyang variabel turunan. Sampeyan bisa nindakake ngelawan.
GO TO FULL VERSION