"Amigo, apa sampeyan seneng paus?"

"Paus? Ora, ora tau krungu bab mau."

"Iku kaya sapi, mung luwih gedhe lan nglangi. Kebetulan, paus asale saka sapi. Eh, utawa paling padha duwe leluhur sing padha. Ora masalah."

Polimorfisme lan overriding - 1

"Ngrungokake. Aku pengin ngomong babagan alat OOP liyane sing kuat banget: polimorfisme . Wis papat fitur."

1) Metode overriding.

Mbayangno yen sampeyan wis nulis kelas "Sapi" kanggo game. Wis akeh variabel anggota lan metode. Objek saka kelas iki bisa nindakake macem-macem perkara: mlaku, mangan, turu. Sapi uga muni lonceng nalika mlaku. Contone, sampeyan wis ngetrapake kabeh ing kelas nganti detail sing paling cilik.

Polimorfisme lan overriding - 2

Banjur dumadakan customer ngandika arep nerbitaké tingkat anyar game, ngendi kabeh tumindak njupuk Panggonan ing segara, lan karakter utama paus.

Sampeyan miwiti kanggo ngrancang kelas Paus lan éling sing iku mung rada beda saka kelas Cow. Kaloro kelas kasebut nggunakake logika sing padha, lan sampeyan mutusake nggunakake warisan.

Kelas Sapi saenipun cocog kanggo dadi kelas induk: wis duwe kabeh variabel lan metode sing dibutuhake. Sampeyan mung kudu nambah kemampuan paus kanggo nglangi. Nanging ana masalah: paus sampeyan duwe sikil, sungu, lan lonceng. Sawise kabeh, kelas Cow ngetrapake fungsi kasebut. Apa sing kowe iso?

Polimorfisme lan overriding - 3

Cara overriding teka kanggo ngluwari. Yen kita marisi cara sing ora nindakake persis apa sing kita perlu ing kelas anyar kita, kita bisa ngganti cara karo liyane.

Polimorfisme lan overriding - 4

Kepiye carane iki rampung? Ing kelas turunan kita, kita ngumumake metode sing pengin diganti (kanthi tandha cara sing padha karo kelas induk) . Banjur kita nulis kode anyar kanggo metode kasebut. Mekaten. Kaya-kaya metode tuwa kelas induk ora ana.

Mangkene cara kerjane:

Kode Katrangan
class Cow
{
public void printColor()
{
System.out.println("I'm white");
}
public void printName()
{
System.out.println("I'm a cow");
}
}class Whale extends Cow
{
public void printName()
{
System.out.println("I'm a whale");
}
}
Kene kita nemtokake rong kelas:  Cow lan  WhaleWhalepusaka  Cow.

Kelas kasebut  Whale ngganti  printName();metode kasebut.

public static void main(String[] args)
{
Cow cow = new Cow();
cow.printName();
}
Kode iki nampilake " Aku sapi " ing layar.
public static void main(String[] args)
{
Whale whale = new Whale();
whale.printName();
}
Kode iki nampilake " Aku paus " ing layar

Sawise menehi warisan Cowlan nimpa printName, Whalekelas kasebut duwe data lan metode ing ngisor iki:

Kode Katrangan
class Whale
{
public void printColor()
{
System.out.println("I'm white");
}
public void printName()
{
System.out.println("I'm a whale");
}
}
Kita ora ngerti apa-apa babagan cara lawas.

"Jujur, iku sing dakkarepake."

2) Nanging ora kabeh.

"Saumpama  Cow kelas kasebut duwe  printAllmetode , sing nyebutake rong metode liyane. Banjur kode kasebut bakal kaya mangkene:"

Layar bakal nuduhake:
Aku putih
aku paus

Kode Katrangan
class Cow
{
public void printAll()
{
printColor();
printName();
}
public void printColor()
{
System.out.println("I'm white");
}
public void printName()
{
System.out.println("I'm a cow");
}
}

class Whale extends Cow
{
public void printName()
{
System.out.println("I'm a whale");
}
}
public static void main(String[] args)
{
Whale whale = new Whale();
whale.printAll();
}
Layar bakal nuduhake:
Aku putih
aku paus

Elinga yen metode printAll () kelas Cow diarani obyek Whale, metode printName () Whale bakal digunakake, dudu Cow.

Sing penting dudu kelas sing ditulis metode, nanging ketik (kelas) obyek sing diarani metode kasebut.

"Aku weruh."

"Sampeyan mung bisa marisi lan ngatasi cara non-statis. Cara statis ora diwarisake lan mulane ora bisa ditindhes."

Mangkene tampilan kelas Whale sawise ngetrapake warisan lan ngilangi metode kasebut:

Kode Katrangan
class Whale
{
public void printAll()
{
printColor();
printName();
}
public void printColor()
{
System.out.println("I'm white");
}
public void printName()
{
System.out.println("I'm a whale");
}
}
Mangkene apa sing katon ing kelas Whale sawise ngetrapake warisan lan ngilangi metode kasebut. Kita ora ngerti apa-apa babagan cara lawas printName.

3) Tipe casting.

Punika titik sing luwih menarik. Amarga kelas marisi kabeh cara lan data saka kelas induk, obyek saka kelas iki bisa dirujuk dening variabel kelas induk (lan induk induk, dsb., nganti kelas Obyek). Coba conto iki:

Kode Katrangan
public static void main(String[] args)
{
Whale whale = new Whale();
whale.printColor();
}
Layar bakal nuduhake:
Aku putih.
public static void main(String[] args)
{
Cow cow = new Whale();
cow.printColor();
}
Layar bakal nuduhake:
Aku putih.
public static void main(String[] args)
{
Object o = new Whale();
System.out.println(o.toString());
}
Layar bakal nuduhake:
Whale@da435a.
Metode toString() diwarisake saka kelas Obyek.

"Barang apik. Nanging kenapa sampeyan butuh iki?"

"Iku fitur terkenal. Sampeyan bakal ngerti mengko yen iku banget, banget terkenal."

4) Late binding (pengiriman dinamis).

Mangkene apa sing katon:

Kode Katrangan
public static void main(String[] args)
{
Whale whale = new Whale();
whale.printName();
}
Layar bakal nuduhake:
Aku paus.
public static void main(String[] args)
{
Cow cow = new Whale();
cow.printName();
}
Layar bakal nuduhake:
Aku paus.

Elinga yen dudu jinis variabel sing nemtokake cara printName tartamtu sing kita sebut (saka kelas Cow utawa Whale), nanging jinis obyek sing dirujuk dening variabel kasebut.

Variabel Cow nyimpen referensi kanggo obyek Whale , lan cara printName ditetepake ing kelas Whale bakal disebut.

"Inggih, padha ora nambah sing kanggo kajelasan."

"Ya, ora ketok. Elinga aturan penting iki:"

Sakumpulan metode sing sampeyan bisa nelpon ing variabel ditemtokake dening jinis variabel. Nanging metode / implementasi tartamtu sing diarani ditemtokake dening jinis / kelas obyek sing dirujuk dening variabel.

"Aku bakal nyoba."

"Sampeyan bakal ngalami iki terus-terusan, supaya sampeyan bakal cepet ngerti lan ora bakal lali."

5) Tipe casting.

Casting dianggo beda kanggo jinis referensi, IE kelas, saka apa kanggo jinis primitif. Nanging, konversi widening lan narrowing uga ditrapake kanggo jinis referensi. Coba conto iki:

Widening konversi Katrangan
Cow cow = new Whale();

Konversi widening klasik. Saiki sampeyan mung bisa nelpon cara ditetepake ing kelas Cow ing obyek Whale.

Compiler bakal ngidini sampeyan nggunakake variabel cow mung kanggo nelpon cara sing ditetepake dening jinis Cow.

Narrowing konversi Katrangan
Cow cow = new Whale();
if (cow instanceof Whale)
{
Whale whale = (Whale) cow;
}
Konversi penyempitan klasik kanthi mriksa jinis. Variabel sapi saka jinis Cow nyimpen referensi kanggo obyek Whale.
Kita priksa manawa iki kedadeyan , banjur nindakake konversi jinis (widening). Iki uga disebut casting jinis .
Cow cow = new Cow();
Whale whale = (Whale) cow; //exception
Sampeyan uga bisa nindakake konversi narrowing saka jinis referensi tanpa jinis-mriksa obyek.
Ing kasus iki, yen variabel cow pointing ing soko liyane saka obyek Whale, pangecualian (InvalidClassCastException) bakal di buwang.

6) Lan saiki kanggo soko sedhep. Nelpon cara asli.

Kadhangkala nalika ngganti metode sing diwarisake, sampeyan ora pengin ngganti kabeh. Kadhangkala sampeyan mung pengin nambah sethithik.

Ing kasus iki, sampeyan pengin kode cara anyar nelpon cara sing padha, nanging ing kelas dhasar. Lan Jawa ayo padha nindakake iki. Iki carane iku rampung:  super.method().

Ing ngisor iki sawetara conto:

Kode Katrangan
class Cow
{
public void printAll()
{
printColor();
printName();
}
public void printColor()
{
System.out.println("I'm white");
}
public void printName()
{
System.out.println("I'm a cow");
}
}

class Whale extends Cow
{
public void printName()
{
System.out.print("This is false: ");
super.printName();

System.out.println("I'm a whale");
}
}
public static void main(String[] args)
{
Whale whale = new Whale();
whale.printAll();
}
Layar bakal nuduhake:
Aku putih
Iki palsu: Aku sapi
aku paus

"Hmm. Lha kuwi mau pelajaran. Kuping robotku meh leleh."

"Ya, iki dudu barang sing prasaja. Iki minangka salah sawijining materi sing paling angel sing bakal sampeyan temoni. Profesor janji bakal menehi link menyang materi saka penulis liyane, supaya yen sampeyan isih ora ngerti, sampeyan bisa ngisi jurang."