1. Typecasting

Variabel sing nyimpen jinis referensi (kelas) uga bisa diowahi dadi macem-macem jinis. Nanging iki mung bisa digunakake ing hirarki jinis siji. Ayo goleki conto sing prasaja. Contone, kita duwe hierarki kelas ing ngisor iki, ing ngendi kelas ing ngisor iki marisi kelas ing ndhuwur.

Typecasting

Typecasting jinis referensi uga primitif uga dikategorikaké minangka widening lan narrowing.

Kita waca sing kelas Cat marisi kelas Pet, lan kelas Pet, ing siji, marisi kelas Animal.

Yen kita nulis kode kaya iki:

Animal kitten = new Cat();

Iki minangka konversi jinis widening . Iki uga disebut cast implisit. Kita wis nggedhekake referensi kucing supaya saiki nuduhake obyek Kucing . Kanthi konversi jinis kaya iki, kita ora bakal bisa nggunakake referensi kucing kanggo nelpon cara sing ana ing kelas Cat nanging ora ana ing kelas Animal .

Konversi sing sempit (utawa cast eksplisit) kedadeyan ing arah sing ngelawan:

Cat cat = (Cat) kitten;

Kita kanthi tegas nuduhake yen kita pengin ngirim referensi sing disimpen ing variabel kucing (jinise Kewan ) menyang jinis Kucing .



2. Priksa jinis obyek

Nanging sampeyan kudu ati-ati banget ing kene. Yen sampeyan nindakake iki:

Animal beast = new Cat();
Wolf grayWolf = (Wolf) beast;

Compiler bakal ngidini kode iki, nanging bakal ana kesalahan nalika program mlaku! JVM bakal mbuwang pengecualian:

Exception in thread "main" java.lang.ClassCastException: Cat cannot be cast to a Wolf

Referensi kanggo obyek Kucing mung bisa disimpen ing variabel sing jinise minangka leluhur saka kelas Kucing: Pet, Animal, utawa Object.

Kok ngono?

Titik sing relevan ing kene yaiku referensi obyek digunakake kanggo ngrujuk marang metode lan variabel obyek kasebut . Lan ora bakal ana masalah yen kita nggunakake variabel Animal kanggo nyimpen referensi kanggo obyek Cat: jinis Cat tansah duwe variabel lan cara saka jinis Animal - iku warisan mau!

Nanging yen JVM ngidini kita nyimpen referensi menyang obyek Cat ing variabel Wolf, mula kita bisa uga duwe kahanan sing bisa nyoba nggunakake variabel greyWolf kanggo nelpon metode sing ora ana ing obyek Cat sing disimpen ing variabel kasebut. . Pramila tatanan menika boten pareng.

Jawa nduweni operator khusus instanceofsing ngidini sampeyan mriksa apa obyek saka jinis tartamtu lan mulane bisa disimpen ing variabel saka jinis tartamtu. Iku katon cukup prasaja:

variable instanceof Type

Tuladha:

Animal beast = new Cat();
if (beast instanceof Wolf)
{
   Wolf grayWolf = (Wolf) beast;
}

Kode iki ora bakal njalari kesalahan - sanajan ing runtime.

Ing ngisor iki sawetara conto liyane sing nggambarake kahanan:

Widening jinis konversi Katrangan
Cow cow = new Whale();

Iki minangka konversi widening klasik - ora ana operator konversi jinis sing dibutuhake. Saiki mung cara sing ditetepake ing Cowkelas sing bisa diarani Whaleobyek kasebut.

Ing cowvariabel , kompiler mung ngidini sampeyan nelpon metode sing Cowana ing jinis (kelas).

Narrowing jinis konversi
Cow cow = new Whale();
if (cow instanceof Whale)
{
   Whale whale = (Whale) cow;
}
Konversi narrowing klasik: Sampeyan kudu nambah mriksa jinis lan operator cast.
Variabel Cow cownyimpen referensi kanggo Whaleobyek.
We verifikasi yen iki kasus , lan banjur nindakake (narrowing) jinis konversi. Utawa uga diarani:
jinis cast
.

Cow cow = new Cow();
Whale whale = (Whale) cow; // Exception
Sampeyan bisa mbatesi jinis referensi tanpa mriksa jinis obyek kasebut.
Yen cowvariabel nuduhake obyek sing dudu a Whale, banjur InvalidClassCastExceptionbakal digawe.


3. Nelpon cara asli: supertembung kunci

Nalika overriding metode kelas induk, kadhangkala tinimbang ngganti karo kita dhewe, kita mung pengin nambah sethitik.

Iku bakal kelangan yen kita bisa cara kelas induk ing cara kita, lan banjur nglakokaké sawetara kode kita dhewe. Utawa mbok menawa pisanan nglakokaké kode kita dhewe, lan banjur nelpon cara kelas induk.

Lan Jawa ngidini kita mung. Kanggo nelpon metode kelas induk, tindakake iki:

super.method(arguments);

Tuladha:

class PeaceTime
{
   public double getPi()
   {
      return 3.14;
   }
}

class WarTime extends PeaceTime
{
   public double getPi()
   {
      return super.getPi()*2;  // 3.14*2
   }
}

Ing mangsa perang, regane Pibisa luwih saka 6! Mesthi wae, kita guyon, nanging conto iki nuduhake carane kabeh iki bisa ditindakake.

Ing ngisor iki sawetara conto liyane kanggo njlentrehake sawetara perkara:

Kode Katrangan
class Cow
{
   public void printAll()
   {
      printColor();
      printName();
   }

   public void printColor()
   {
      System.out.println("I'm a white whale");
   }

   public void printName()
   {
      System.out.println("I'm a cow");
   }
}

class Whale extends Cow
{
   public void printName()
   {
      System.out.print("This is incorrect: ");
      super.printName();
      System.out.println("I'm a whale");
   }
}
Cowlan Whalekelas
public static void main(String[] args)
{
   Whale whale = new Whale();
   whale.printAll();
}
Output layar bakal dadi:
I'm a white whale
This is incorrect: I'm a cow
I'm a whale

Iki barang sing angel. Jujur, iki minangka salah sawijining perkara sing paling angel ing OOP . Sing jarene, sampeyan kudu ngerti lan ngerti.