CodeGym /Blog Jawa /Acak /Widening lan narrowing saka jinis referensi
John Squirrels
tingkat
San Francisco

Widening lan narrowing saka jinis referensi

Diterbitake ing grup
Hi! Ing wulangan kepungkur, kita ngrembug jinis primitif casting. Ayo kelingan sedhela apa sing dirembug. Widening lan narrowing jinis referensi - 1Kita 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.

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 inting shortvariabel, iku ora dadi lancar kanggo kita. Sawise kabeh, shortvariabel mung ngemot 16 bit informasi, nanging intana 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 shortvariabel 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 Catlan Dogora 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 introducemetode kelas Petutawa Animalkelas 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 Petreferensi lan diutus kanggo Animalvariabel. 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 WildAnimalvariabel, 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. Widening lan narrowing saka jinis referensi - 2Coba conto liyane sing luwih menarik:

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 Animalobyek lan nyoba nemtokake menyang Petvariabel. 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 petmung 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 Petobyek sing dirujuk dening Petvariabel. Mengko, Animalreferensi nuding obyek sing padha. Sawisé iku, kita ngowahi animalmenyang 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 Animalobyek:

Pet pet = (Pet) new Animal();
Sampeyan ora bisa nemtokake obyek leluhur menyang variabel turunan. Sampeyan bisa nindakake ngelawan.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION