Oleh : Reza Ervani
بسم الله الرحمن الرحيم
Di Java, sebuah class dapat diwariskan dari class yang lain. Ini disebut memperluas/extending sebuah class. Satu class dapat melebarkan class yang lain. Dua class tersebut disebut superclass dan subclass. Subclass melebarkan superclass. Atau subclass diwariskan dari superclass.
Dasar-dasar Pewarisan/Inheritance
Ketika sebuah class diwariskan dari sebuah superclass, dia mewarisi bagian-bagian dari method dan fields yang ada di superclass. Subclass dapat juga menimpa/override (mendefinisikan ulang) metode turunan. Tapi tidak untuk fields.
Ketika sebuah class diwariskan dari sebuah superclass, kita dapat mereferensi class sebagai sebuah instance dari subclass ataupun dari superclass. Kita akan bahas ini lebih lanjut nanti.
Di Java sebuah class hanya dapat diwariskan dari satu superclass. Di beberapa bahasa, seperti C++, adalah dimungkinkan bagi subclass untuk mewarisi dari beberapa superclass (multiple inheritance). Dikarenakan multiple inheritance dapat membuat beberapa permasalahan yang aneh, misalnya jika metode yang ada di superclass memiliki nama dan parameter yang sama, karena itu multiple inheritance tidak berlaku di java.
Perwarisan dapat menjadi suatu metode yang efektif untuk berbagi kode antara class-class yang memiliki sifat yang sama dan bagian lain yang berbeda.
Berikut diagram yang mengilustrasikan sebuah class yang disebut Vehicle
, yang memiliki dua subclass yakni Car
dan Truck
.
Deklarasi Pewarisan
Kita mendeklarasikan bahwa satu class melebarkan/extend class lain dengan menggunakan keyword extends
pada saat pendefinisian class. Seperti contoh berikut :
Superclass :
public class Vehicle { protected String licensePlate = null; public void setLicensePlate(String license) { this.licensePlate = license; } }
SubClass :
public class Car extends Vehicle { protected String owner = null; public String getLicenseAndOwner() { return this.licensePlate + " : " + this.owner; } }
class Car
pada contoh tersebut dilebarkan dari class Vehicle
Catat bagaimana class Car
dapat mengakses field licensePlate
pada class Vehicle
dari dalam metode getLicenseAndOwner()
. Karena class Car
merupakan pewaris dari class Vehicle
,field licensePlate
kini dapat diakses didalam instance Car
. Dengan kata lain instance Car
juga adalah sebuah instance Vehicle
Referensi
Pada contoh sebelumnya, kita dapat mereferensi sebuah instance dari class Car
sebagai instance dari class Vehicle
. Karena class Car
dilebarkan (diwariskan dari) class Vehicle
, dia juga disebut jadi sebuah Vehicle
.
Berikut contoh kodenya :
Car car = new Car(); car.setLicensePlate("1234XYZ"); String licenseAndOwner = car.getLicenseAndOwner(); Vehicle vehicle = car; vehicle.setLicensePlate("9999ABC");
Pertama-tama sebuah instance Car
dibuat. Kemudian metode setLicensePlate()
dan getLicenseAndOwner()
dipanggil.
Kedua, instance Car
diberikan ke sebuah variabel Vehicle
. Kini variabel (referensi) Vehicle
menunjuk kepada instance Car
. Setelah itu metode setLicensePlate()
dipanggil. Catat, dikarenakan class Vehicle
tidak memiliki metode getLicenseAndOwner()
, kita tidak bisa memanggil metode tersebut via referensi Vehicle
, bahkan jika objek yang ditunjuk adalah benar-benar objek Car
Sebagaimana yang bisa kita lihat, adalah mungkin untuk menggunakan instance dari beberapa subclass, sebagai sebuah instance dari superclass juga. Dengan cara ini, kita tidak perlu mengetahui dengan pasti objek sebuah subclass. Kita dapat memperlakukan misalnya baik instance Truck
dan Car
sebagai instance Vehicle
Apa itu Pewarisan ?
Ketika sebuah subclass melebarkan sebuah superclass, semua field dan metode protected dan public dapat diakses dari subclass. Field dan metode yang memiliki cakupan paket dpaat diakses oleh subclass hanya jika subclass berlokasi sama dengan paket yang sama dengan superclass. Field dan metode private dari superclass tidak akan bisa direferensikan oleh subclass.
Menimpa Metode
Di sebuah subclass kita dapat menimpa/override (didefinisikan ulang) metode yang ada di superclass. Berikut contohnya :
SuperClass :
public class Vehicle { String licensePlate = null; public void setLicensePlate(String licensePlate) { this.licensePlate = licensePlate; } }
SubClass
public class Car extends Vehicle { public void setLicensePlate(String license) { this.licensePlate = license.toLowerCase(); } }
Perhatikan bagaimana kedua class Vehicle
dan class Car
mendefinisikan metode yang disebut setLicensePlate()
. Setelah itu, kapanpun metode setLicensePlate()
dipanggil, maka metode yang didefinisikan di subclass lah yang dipanggil. Metode yang ada di superclass akan diabaikan
Untuk menimpa metode ini, definisi metode di subclass mestilah memiliki nama yang persis sama dan angka parameter yang sama, dan parameter mestilah didaftarkan dalam urutan yang persis sama dengan urutan yang ada di superclass. Jika tida metode di subclass akan dianggap sebagai metode yang terpisah.
Kita tidak dapat menimpat metode privat yang ada di superclass. Jika supercalss memanggil private metode secara internal dari metode yang lain maka dia akan melanjutkan pemanggilan metode tersebut dari superclass, bahkan jika anda membuat metode private
Memanggil Metode Superclass
Jika kita menimpa sebuah metode di subclass, tetapi masih perlu untuk memanggil metode yang didefinisikan di superclass, kita dapat melakukan hal tersebut dengan menggunakan referensi super
seperti berikut :
public class Car extends Vehicle { public void setLicensePlate(String license) { super.setLicensePlate(license); } }
Pada contoh kode diatas metode setLicensePlate()
pada class Car
, memanggil metode setLicensePlate()
pada class Vehicle
Kita dapat memanggil implementasi superclass dari metode apapun di sebuah subclass seperti diatas. Tidak perlu dalam bentuk metode overridden tersendiri. Sebagai contoh, kita dapat melakukan super.setLicensePlate()
dari metode class Car
yang disebut updateLicensePlate()
yang tidak menimpa/override metode setLicensePlate()
Anotasi @override
Jika kita menimpa suatu metode di suatu subclass, dan metode semuanya tiba-tiba dirubah atau diganti namanya atau signaturenya dirubah di superclass, metode yang ada di subclass tidak lagi menimpa/override metode yang ada di subclass. Tapi bagaimana kita bisa mengetahui hal itu ? Tentu akan lebih baik jika compiler memberitahukan kepada kita bahwa metode override kita tidak lagi menimpa suatu metode di superclass.
Disinilah anotasi/tanda @override
diatas sebuah metode digunakan. Berikut contohnya :
public class Car extends Vehicle { @Override public void setLicensePlate(String license) { this.licensePlate = license.toLowerCase(); } }
Fields
Sebagaimana disebutkan sebelumnya, fields tidak dapat dioverride di sebuah subclass. Jika kita mendefinisikan sebuah fields di suatu subclass dengan nama yang sama dengan sebuah field di superclass, field di subclass akan menyembunyikan field di superclass. Jika subclass mencoba mengakses field tersebut, dia akan mengkakses field di subclass, bukan di superclass.
Jika, bagaimanapun, subclass mencoba memanggil metode di superclass, dan metode tersebut mengakses field dengan nama yang sama di subclass, maka field di superclass-lah yang akan diakses.
Berikut contohnya :
SuperClass
public class Vehicle { String licensePlate = null; public void setLicensePlate(String licensePlate) { this.licensePlate = licensePlate; } public String getLicensePlate() { return licensePlate; } }
SubClass :
public class Car extends Vehicle { protected String licensePlate = null; @Override public void setLicensePlate(String license) { super.setLicensePlate(license); } @Override public String getLicensePlate() { return super.getLicensePlate(); } public void updateLicensePlate(String license){ this.licensePlate = license; } }
Perhatikan bagaimana kedua class memiliki field licensePlate
Baik class Vehicle
dan class Car
memiliki metode setLicensePlate()
dan getLicensePlate()
. Metode di class Car
memanggil metode yang berhubungan di class Vehicle
. Hasilnya adalah, pada akhirnya kedua metode mengkases field licensePlate
di class Vehicle
.
Hanya saja Metode updateLicensePlate()
di class Car
mengakses field licensePlate
secara langsung. Sehingga ia mengakses field licensePlate
di class Car
. Sementara, kita tidak akan mendapatkan hasil yang sama jika kita memanggil setLicensePlate()
seperti ketika kita memanggil metode updateLicense()
Perhatikan kode di bawah ini “
Car car = new Car(); car.setLicensePlate("123"); car.updateLicensePlate("abc"); System.out.println("license plate: " + car.getLicensePlate());
Kode ini akan menghasilkan keluaran nilai teks 123
Metode updateLicensePlate()
mengatur nilai license plate pada field licensePlate
di class Car
. Sementara Metode getLicensePlate()
memberikan nilai fiedl licensePlate
yang ada di class Vehicle
. Sehingga, nilai 123 yang merupakan nilai yang adad di field licensePlate
pada class Vehicle
via metode thesetLicensePlate()
adalah yang dikeluarkan.
(reza@rumahilmu.or.id)
gan gmna sih cara bikin pewarisan jendela. saya binggung banget gan. keluaran.a tuh (masukan jenis jendela , panjang, lebar, luas, keliling) gmna ya gan cara.a
jdi tuh jendel.A ada anak.a 2 yaitu persegi panjang sama bujur sangkar, terus dicarai luas sama keliling…. cara.a gmna ya gan. mohon bantuan.a