Kami sebelumnya menggunakan kelas untuk membuat tipe baru, dan menggunakan warisan untuk memfasilitasi proses pembuatan kelas. Dalam kuliah ini saya akan mendalami tipe dan memperkenalkan konsep polimorfisme.
pengecekan tipe
Variabel dan referensi apa pun di Java hanya dapat digunakan setelah melewati deklarasi tipe. Kita telah melihat sebelumnya bahwa data objek, data kelas, parameter metode, nilai pengembalian metode, dan variabel otomatis di dalam metode semuanya perlu mendeklarasikan tipenya. Java adalah bahasa yang sangat diketik, yang memeriksa tipe. Jika kita menggunakan tipe yang salah maka akan menimbulkan error.
Tipe tidak cocok, kelucuan tidak valid
Misalnya, di kelas Test di bawah ini, kita menugaskan objek kelas Cup ke referensi kelas Person:
public class Test{ public static void main(String[] args) { Human aPerson; aPerson = new Cup(); }class Human{ /** * konstruktor */ public Human(int h) { this.height = h; } /** * accessor */ public int getHeight() { kembalikan this.height; } /** * mutator */ public void tumbuhHeight(int h) { this.height = this.height + h; int tinggi;}cangkir kelas { public void addWater(int w) { this.water = this.water + w; } public void drinkWater(int w) { this.water = this.water - w; ;}
javac akan kembali:
ditemukan : Piala yang diperlukan: Human aPerson = new Cup(); ^1 error
Konversi tipe dasar
Java dapat melakukan konversi tipe pada variabel tipe dasar. Tipe dasar yang berbeda memiliki panjang dan rentang penyimpanan yang berbeda. Jika kita mengkonversi dari tipe presisi tinggi ke tipe presisi rendah, seperti mengkonversi dari float ke int, maka kita mungkin kehilangan informasi. Konversi seperti ini disebut konversi penyempitan. Dalam hal ini, kita perlu mendeklarasikan konversi tipe secara eksplisit, seperti:
public class Test{ public static void main(String[] args) { int a;
Jika kita mengkonversi dari tipe presisi rendah ke tipe presisi tinggi, tidak ada kekhawatiran tentang kehilangan informasi. Transformasi seperti ini disebut konversi yang melebar. Kita tidak perlu secara eksplisit mewajibkan konversi tipe, Java dapat melakukannya secara otomatis:
public class Test{ public static void main(String[] args) { int a = 3; double b = a; // pelebaran konversi System.out.println(a);
Konversi tipe dasar
upcast dan polimorfisme
Di Java, referensi juga bisa diketik, tetapi ada batasannya.
Kita dapat mengonversi referensi kelas turunan ke referensi kelas dasarnya, yang disebut konversi upcast atau santai. Kelas BrokenCup berikut mewarisi dari kelas Cup dan menggantikan metode addWater() dan drinkWater() asli di kelas Cup:
public class Test{ public static void main(String[] args) { Piala BrokenCup aBrokenCup = new BrokenCup(); aCup = aBrokenCup; void addWater(int w) { ini.air = ini.air + w; } public void minumanAir(int w) { ini.air = ini.air - w; } private int water = 0;} class BrokenCup extends Cup{ public void addWater(int w) { System.out.println("sial, cangkir pecah" } public void drinkWater(int w) { System.out. println("om...num..., tidak ada air di dalam"); }}
Hasil program yang berjalan:
sial, cangkir pecah
Seperti yang Anda lihat di atas, tanpa instruksi eksplisit apa pun, kami menetapkan referensi kelas turunan aBrokenCup ke referensi kelas dasar aCup. Konversi jenis akan dilakukan secara otomatis oleh Java.
Kami kemudian memanggil metode addWater() dari aCup (yang kami nyatakan bertipe Cup). Meskipun aCup adalah referensi tipe Cup, aCup sebenarnya memanggil metode addWater() dari BrokenCup! Dengan kata lain, meskipun kita melonggarkan tipe referensi ke kelas dasarnya melalui upcast, Java masih dapat mengidentifikasi tipe objek itu sendiri dengan benar dan memanggil metode yang benar. Java dapat mengidentifikasi tipe sebenarnya dari suatu objek berdasarkan situasi saat ini. Ini disebut polimorfisme. Polimorfisme merupakan aspek penting dari berorientasi objek.
Polimorfisme adalah mekanisme yang didukung oleh Java dan juga merupakan konsep berorientasi objek yang penting. Hal ini menimbulkan pertanyaan taksonomi apakah objek subkelas sebenarnya "adalah" objek kelas induk. Misalnya burung juga binatang; mobil juga harus menjadi alat transportasi. Java memberitahu kita bahwa objek kelas turunan dapat digunakan sebagai objek kelas dasar, dan Java akan menangani situasi ini dengan benar.
Misalnya hubungan pewarisan berikut:
Kita dapat mengatakan bahwa kita minum air dari cangkir. Faktanya, arti spesifik dari tindakan minum air akan sangat berubah di kelas turunan. Misalnya, minum air melalui sedotan dan minum air dari pecahan gelas sangatlah berbeda, meskipun kita semua berbicara tentang "air minum" secara abstrak. Tentu saja, kita dapat memprogram secara terpisah untuk setiap kelas turunan dan memanggil metode DrinkWater yang berbeda. Namun, sebagai pemrogram, kita dapat memprogram sebuah cangkir dan memanggil metode DrinkWater() dari Cup, terlepas dari jenis turunan cangkir tersebut. Java akan memanggil metode yang benar, seperti yang bisa kita lihat pada program di atas.
Melihat contoh yang lebih bermakna, kita menambahkan metode minuman() ke kelas Manusia. Metode ini menerima objek cangkir dan bilangan bulat sebagai parameter. Bilangan bulat mewakili jumlah air yang diminum:
public class Test{ public static void main(String[] args) { Tamu manusia = Manusia baru(); BrokenCup hisCup = new BrokenCup(); , int w) { aCup.minumanAir(w);
Hasil program yang berjalan:
Sial, tidak ada air di dalamnya
Dalam definisi minuman() kelas Manusia, kami mengharuskan parameter pertama menjadi referensi tipe Piala. Namun dalam aplikasi sebenarnya (kelas Tes), objek kelas turunan BrokenCup dari Cup digunakan. Ini sebenarnya mengangkat hisCup ke kelas Cup dan meneruskannya ke metode minuman(). Dalam metode ini, kami memanggil metode DrinkWater(). Java menemukan bahwa objek ini sebenarnya adalah objek BrokenCup, sehingga disebut metode BrokenCup yang sesuai.
sedih
Kita dapat melakukan downcast referensi kelas dasar ke referensi kelas turunan, namun objek yang ditunjuk oleh referensi kelas dasar sudah menjadi objek kelas turunan yang akan didowncast. Misalnya, hisCup di atas dapat diubah ke atas menjadi referensi kelas Piala, dan kemudian diubah ke bawah menjadi referensi kelas BrokenCup.
Jenis objek
Di Java, semua kelas sebenarnya memiliki nenek moyang warisan yang sama, yaitu kelas Object. Kelas Object menyediakan beberapa metode, seperti toString(). Kita dapat mengganti metode ini dalam definisi kelas kita sendiri.
Objek: leluhur
Kita dapat menulis sebuah program yang mengoperasikan objek Object, dan meneruskan objek apa pun ke program melalui upcast.
Saya akan mempelajari kelas Object nanti.
(Penerapan polimorfisme bergantung pada dukungan RTTI. Saya akan membahasnya lebih detail nanti.)
Meringkaskan
Konversi tipe dasar
polimorfisme
sedih
Obyek