Dasar Java : Inheritance/Pewarisan

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.

inheritance-1

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)

About Reza Ervani 426 Articles
Adalah pendiri programming.rezaervani.com -

1 Comment

  1. 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

Leave a Reply

Your email address will not be published.


*


This site uses Akismet to reduce spam. Learn how your comment data is processed.