- 1 1. Introduction
- 2 2. What Is Java Inheritance?
- 3 3. How the extends Keyword Works
- 4 4. Overriding Metode dan Keyword super
- 5 5. Keuntungan dan Kerugian Pewarisan
- 6 6. Perbedaan Antara Pewarisan dan Interface
- 7 7. Praktik Terbaik untuk Menggunakan Pewarisan
- 8 8. Ringkasan
- 9 9. Pertanyaan yang Sering Diajukan (FAQ)
1. Introduction
Java adalah bahasa pemrograman yang banyak digunakan di berbagai bidang, mulai dari sistem perusahaan hingga aplikasi web dan pengembangan Android. Di antara banyak fiturnya, “inheritance” (pewarisan) adalah salah satu konsep paling penting saat mempelajari pemrograman berorientasi objek.
Dengan menggunakan pewarisan, sebuah kelas baru (subclass/kelas anak) dapat mengambil alih fungsionalitas dari kelas yang sudah ada (superclass/kelas induk). Hal ini membantu mengurangi duplikasi kode dan membuat program lebih mudah diperluas serta dipelihara. Di Java, pewarisan diimplementasikan menggunakan kata kunci extends.
Dalam artikel ini, kami menjelaskan secara jelas peran kata kunci extends dalam Java, penggunaan dasarnya, aplikasi praktis, dan pertanyaan umum. Panduan ini berguna tidak hanya bagi pemula Java tetapi juga bagi mereka yang ingin meninjau kembali konsep pewarisan. Pada akhir pembahasan, Anda akan memahami sepenuhnya kelebihan dan kekurangan pewarisan serta pertimbangan desain yang penting.
Mari kita mulai dengan melihat lebih dekat “Apa itu pewarisan di Java?”
2. What Is Java Inheritance?
Pewarisan Java adalah mekanisme di mana satu kelas (superclass/kelas induk) memindahkan karakteristik dan fungsionalitasnya ke kelas lain (subclass/kelas anak). Dengan pewarisan, bidang (variabel) dan metode (fungsi) yang didefinisikan di kelas induk dapat digunakan kembali di kelas anak.
Mekanisme ini memudahkan pengorganisasian dan pengelolaan kode, memusatkan proses yang dibagikan, serta memperluas atau memodifikasi fungsionalitas secara fleksibel. Pewarisan adalah salah satu dari tiga pilar inti Pemrograman Berorientasi Objek (OOP), bersama enkapsulasi dan polimorfisme.
About the “is-a” Relationship
Contoh umum pewarisan adalah “hubungan is-a”. Misalnya, “Seekor Anjing adalah Hewan.” Ini berarti kelas Dog mewarisi dari kelas Animal. Seekor Anjing dapat mengambil karakteristik dan perilaku Hewan sambil menambahkan fitur uniknya sendiri.
class Animal {
void eat() {
System.out.println("食べる");
}
}
class Dog extends Animal {
void bark() {
System.out.println("ワンワン");
}
}
Dalam contoh ini, kelas Dog mewarisi dari kelas Animal. Sebuah instance Dog dapat menggunakan baik metode bark maupun metode eat yang diwarisi.
What Happens When You Use Inheritance?
- Anda dapat memusatkan logika dan data yang dibagikan di kelas induk, mengurangi kebutuhan menulis kode yang sama berulang kali di setiap subclass.
- Setiap subclass dapat menambahkan perilaku uniknya sendiri atau menimpa (override) metode kelas induk.
Menggunakan pewarisan membantu mengatur struktur program dan mempermudah penambahan fitur serta pemeliharaan. Namun, pewarisan tidak selalu menjadi pilihan terbaik, dan penting untuk mengevaluasi secara cermat apakah benar ada “hubungan is-a” selama perancangan.
3. How the extends Keyword Works
Kata kunci extends di Java secara eksplisit menyatakan pewarisan kelas. Ketika sebuah kelas anak mewarisi fungsionalitas dari kelas induk, sintaks extends ParentClassName digunakan dalam deklarasi kelas. Ini memungkinkan kelas anak menggunakan semua anggota publik (bidang dan metode) dari kelas induk secara langsung.
Basic Syntax
class ParentClass {
// Fields and methods of the parent class
}
class ChildClass extends ParentClass {
// Fields and methods unique to the child class
}
Sebagai contoh, menggunakan kelas Animal dan Dog yang telah dibahas sebelumnya, kita memperoleh:
class Animal {
void eat() {
System.out.println("食べる");
}
}
class Dog extends Animal {
void bark() {
System.out.println("ワンワン");
}
}
Dengan menulis Dog extends Animal, kelas Dog mewarisi dari kelas Animal dan dapat menggunakan metode eat.
Using Parent Class Members
Dengan pewarisan, sebuah instance kelas anak dapat mengakses metode dan bidang kelas induk (selama modifier akses mengizinkannya):
Dog dog = new Dog();
dog.eat(); // Calls the parent class method
dog.bark(); // Calls the child class method
Catatan Penting
- Java hanya mengizinkan pewarisan dari satu kelas (pewarisan tunggal). Anda tidak dapat menentukan beberapa kelas setelah
extends. - Jika Anda ingin mencegah pewarisan, Anda dapat menggunakan modifier
finalpada kelas.
Tips Pengembangan Praktis
Penggunaan extends yang tepat memungkinkan Anda memusatkan fungsionalitas umum dalam kelas induk dan memperluas atau menyesuaikan perilaku di subclass. Ini juga berguna ketika Anda ingin menambahkan fitur baru tanpa mengubah kode yang ada.
4. Overriding Metode dan Keyword super
Ketika menggunakan pewarisan, ada kasus di mana Anda ingin mengubah perilaku suatu metode yang didefinisikan di kelas induk. Ini disebut “overriding metode.” Di Java, overriding dilakukan dengan mendefinisikan metode di kelas anak dengan nama dan daftar parameter yang sama seperti metode di kelas induk.
Overriding Metode
Ketika melakukan overriding sebuah metode, biasanya ditambahkan anotasi @Override. Ini membantu kompiler mendeteksi kesalahan tidak sengaja seperti nama metode atau tanda tangan yang salah.
class Animal {
void eat() {
System.out.println("食べる");
}
}
class Dog extends Animal {
@Override
void eat() {
System.out.println("ドッグフードを食べる");
}
}
Dalam contoh ini, kelas Dog melakukan overriding metode eat. Saat memanggil eat pada sebuah instance Dog, outputnya akan menjadi “ドッグフードを食べる”.
Dog dog = new Dog();
dog.eat(); // Displays: ドッグフードを食べる
Menggunakan Keyword super
Jika Anda ingin memanggil metode asli kelas induk di dalam metode yang di‑override, gunakan keyword super.
class Dog extends Animal {
@Override
void eat() {
super.eat(); // Calls the parent class’s eat()
System.out.println("ドッグフードも食べる");
}
}
Ini akan mengeksekusi metode eat kelas induk terlebih dahulu, kemudian menambahkan perilaku subclass.
Konstruktor dan super
Jika kelas induk memiliki konstruktor dengan parameter, kelas anak harus secara eksplisit memanggilnya menggunakan super(argumen) sebagai baris pertama dalam konstruktornya.
class Animal {
Animal(String name) {
System.out.println("Animal: " + name);
}
}
class Dog extends Animal {
Dog(String name) {
super(name);
System.out.println("Dog: " + name);
}
}
Ringkasan
- Overriding berarti mendefinisikan ulang metode kelas induk di kelas anak.
- Menggunakan anotasi
@Overridedisarankan. - Gunakan
superketika Anda ingin menggunakan kembali implementasi metode kelas induk. superjuga digunakan saat memanggil konstruktor kelas induk.
5. Keuntungan dan Kerugian Pewarisan
Penggunaan pewarisan di Java memberikan banyak manfaat bagi desain dan pengembangan program. Namun, penggunaan yang tidak tepat dapat menyebabkan masalah serius. Di bawah ini, kami menjelaskan keuntungan dan kerugian secara detail.
Keuntungan Pewarisan
- Meningkatkan reuse kode Mendefinisikan logika dan data yang dibagikan di kelas induk menghilangkan kebutuhan untuk mengulang kode yang sama di setiap subclass. Ini mengurangi duplikasi dan meningkatkan pemeliharaan serta keterbacaan.
- Mempermudah ekstensi Ketika fungsionalitas baru diperlukan, Anda dapat membuat subclass baru berdasarkan kelas induk tanpa mengubah kode yang ada. Ini meminimalkan dampak perubahan dan mengurangi kemungkinan bug.
- Memungkinkan polimorfisme Pewarisan memungkinkan “sebuah variabel kelas induk mereferensikan sebuah instance kelas anak.” Ini memungkinkan desain yang fleksibel menggunakan antarmuka umum dan perilaku polimorfik.
Kerugian Pewarisan
- Hirarki yang dalam membuat desain rumit Jika rantai pewarisan menjadi terlalu dalam, menjadi sulit untuk memahami di mana perilaku didefinisikan, membuat pemeliharaan lebih sulit.
- Perubahan pada kelas induk memengaruhi semua subkelas Memodifikasi perilaku kelas induk mungkin secara tidak sengaja menyebabkan masalah di seluruh subkelas. Kelas induk memerlukan desain dan pembaruan yang hati-hati.
- Dapat mengurangi fleksibilitas desain Penggunaan berlebihan pewarisan mengikat kelas secara ketat, membuat perubahan di masa depan sulit. Dalam beberapa kasus, hubungan “has-a” menggunakan komposisi lebih fleksibel daripada pewarisan “is-a”.
Ringkasan
Pewarisan sangat kuat, tetapi mengandalkannya untuk segalanya dapat menyebabkan masalah jangka panjang. Selalu verifikasi apakah hubungan “is-a” yang sebenarnya ada dan terapkan pewarisan hanya ketika tepat.
6. Perbedaan Antara Pewarisan dan Interface
Java menyediakan dua mekanisme penting untuk memperluas dan mengorganisir fungsionalitas: pewarisan kelas (extends) dan interface (implements). Keduanya mendukung penggunaan ulang kode dan desain fleksibel, tetapi struktur dan penggunaan yang dimaksudkan berbeda secara signifikan. Di bawah ini, kami menjelaskan perbedaannya dan bagaimana memilih di antara keduanya.
Perbedaan Antara extends dan implements
- extends (Pewarisan)
- Anda hanya dapat mewarisi dari satu kelas (pewarisan tunggal).
- Field dan metode yang sepenuhnya diimplementasikan dari kelas induk dapat digunakan langsung di subkelas.
- Mewakili hubungan “is-a” (misalnya, seekor Anjing adalah seekor Hewan).
- implements (Implementasi Interface)
- Beberapa interface dapat diimplementasikan secara bersamaan.
- Interface hanya berisi deklarasi metode (meskipun metode default ada sejak Java 8 ke depan).
- Mewakili hubungan “can-do” (misalnya, seekor Anjing dapat menggonggong, seekor Anjing dapat berjalan).
Contoh Penggunaan Interface
interface Walkable {
void walk();
}
interface Barkable {
void bark();
}
class Dog implements Walkable, Barkable {
public void walk() {
System.out.println("歩く");
}
public void bark() {
System.out.println("ワンワン");
}
}
Dalam contoh ini, kelas Dog mengimplementasikan dua interface, Walkable dan Barkable, memberikan perilaku yang mirip dengan pewarisan berganda.

Mengapa Interface Diperlukan
Java melarang pewarisan berganda kelas karena dapat menciptakan konflik ketika kelas induk mendefinisikan metode atau field yang sama. Interface menyelesaikan masalah ini dengan memungkinkan kelas untuk mengadopsi beberapa “tipe” tanpa mewarisi implementasi yang bertentangan.
Cara Menggunakannya dengan Benar
- Gunakan
extendsketika hubungan “is-a” yang jelas ada antara kelas. - Gunakan
implementsketika Anda ingin menyediakan kontrak perilaku umum di seluruh beberapa kelas.
Contoh:
- “Seekor Anjing adalah seekor Hewan” →
Dog extends Animal - “Seekor Anjing dapat berjalan dan dapat menggonggong” →
Dog implements Walkable, Barkable
Ringkasan
- Sebuah kelas hanya dapat mewarisi dari satu kelas induk, tetapi dapat mengimplementasikan beberapa interface.
- Memilih antara pewarisan dan interface berdasarkan niat desain mengarah pada kode yang bersih, fleksibel, dan mudah dipelihara.
7. Praktik Terbaik untuk Menggunakan Pewarisan
Pewarisan di Java sangat kuat, tetapi penggunaan yang tidak tepat dapat membuat program kaku dan sulit dipelihara. Di bawah ini adalah praktik terbaik dan pedoman untuk menggunakan pewarisan secara aman dan efektif.
Kapan Menggunakan Pewarisan — dan Kapan Menghindarinya
- Gunakan pewarisan ketika:
- Hubungan “is-a” yang jelas ada (misalnya, seekor Anjing adalah seekor Hewan).
- Anda ingin menggunakan ulang fungsionalitas kelas induk dan memperluasnya.
- Anda ingin menghilangkan kode redundan dan memusatkan logika umum.
- Hindari pewarisan ketika:
- Anda menggunakannya hanya untuk penggunaan ulang kode (ini sering mengarah pada desain kelas yang tidak alami).
- Hubungan “has-a” lebih tepat — dalam kasus seperti itu, pertimbangkan komposisi.
Memilih Antara Pewarisan dan Komposisi
- Inheritance (
extends): hubungan is-a - Contoh:
Dog extends Animal - Berguna ketika subclass benar-benar mewakili tipe dari superclass.
- Composition (has-a relationship)
- Contoh: Sebuah Mobil memiliki Engine
- Menggunakan instance dari kelas lain secara internal untuk menambah fungsionalitas.
- Lebih fleksibel dan lebih mudah beradaptasi dengan perubahan di masa depan.
Pedoman Desain untuk Mencegah Penyalahgunaan Inheritance
- Jangan membuat hierarki inheritance terlalu dalam (batasi hingga 3 tingkat atau kurang).
- Jika banyak subclass mewarisi dari parent yang sama, evaluasi kembali apakah tanggung jawab parent tersebut tepat.
- Selalu pertimbangkan risiko bahwa perubahan pada kelas parent akan memengaruhi semua subclass.
- Sebelum menerapkan inheritance, pertimbangkan alternatif seperti interface dan composition.
Membatasi Inheritance dengan Modifier final
- Menambahkan
finalpada sebuah kelas mencegahnya untuk diwarisi. - Menambahkan
finalpada sebuah metode mencegahnya untuk dioverride oleh subclass.final class Utility { // This class cannot be inherited } class Base { final void show() { System.out.println("オーバーライド禁止"); } }
Meningkatkan Dokumentasi dan Komentar
- Mendokumentasikan hubungan inheritance dan niat desain kelas dalam Javadoc atau komentar membuat pemeliharaan di masa depan jauh lebih mudah.
Ringkasan
Inheritance memang nyaman, tetapi harus digunakan dengan sengaja. Selalu tanyakan, “Apakah kelas ini benar-benar merupakan jenis dari kelas parent‑nya?” Jika ragu, pertimbangkan composition atau interface sebagai alternatif.
8. Ringkasan
Sampai titik ini, kami telah menjelaskan inheritance Java dan keyword extends secara detail—dari dasar hingga penggunaan praktis. Berikut adalah rangkuman poin‑poin utama yang dibahas dalam artikel ini.
- Inheritance Java memungkinkan subclass mengambil alih data dan fungsionalitas superclass, memungkinkan desain program yang efisien dan dapat digunakan kembali.
- Keyword
extendsmemperjelas hubungan antara kelas parent dan child (hubungan “is-a”). - Overriding metode dan keyword
supermemungkinkan memperluas atau menyesuaikan perilaku yang diwarisi. - Inheritance menawarkan banyak keuntungan, seperti penggunaan kembali kode, extensibility, dan dukungan untuk polymorphism, tetapi juga memiliki kelemahan seperti hierarki yang dalam atau kompleks serta perubahan berdampak luas.
- Memahami perbedaan antara inheritance, interface, dan composition sangat penting untuk memilih pendekatan desain yang tepat.
- Hindari penggunaan inheritance secara berlebihan; selalu jelaskan niat desain dan alasan di baliknya.
Inheritance adalah salah satu konsep inti pemrograman berorientasi objek di Java. Dengan memahami aturan dan praktik terbaik, Anda dapat menerapkannya secara efektif dalam pengembangan dunia nyata.
9. Pertanyaan yang Sering Diajukan (FAQ)
Q1: Apa yang terjadi pada konstruktor kelas parent ketika sebuah kelas diwarisi di Java?
A1: Jika kelas parent memiliki konstruktor tanpa argumen (default), konstruktor tersebut secara otomatis dipanggil dari konstruktor kelas child. Jika kelas parent hanya memiliki konstruktor dengan parameter, kelas child harus secara eksplisit memanggilnya menggunakan super(arguments) di awal konstruktornya.
Q2: Apakah Java dapat melakukan multiple inheritance pada kelas?
A2: Tidak. Java tidak mendukung multiple inheritance pada kelas. Sebuah kelas hanya dapat memperluas satu kelas parent menggunakan extends. Namun, sebuah kelas dapat mengimplementasikan banyak interface menggunakan implements.
Q3: Apa perbedaan antara inheritance dan composition?
A3: Inheritance mewakili “hubungan is-a,” di mana kelas child menggunakan kembali fungsionalitas dan data dari kelas parent. Composition mewakili “hubungan has-a,” di mana sebuah kelas berisi instance dari kelas lain. Composition sering menawarkan fleksibilitas lebih dan lebih disukai dalam banyak kasus yang memerlukan loose coupling atau extensibility di masa depan.
Q4: Apakah modifier final membatasi pewarisan dan overriding?
A4: Ya. Jika sebuah kelas ditandai sebagai final, kelas tersebut tidak dapat diwarisi. Jika sebuah metode ditandai sebagai final, metode tersebut tidak dapat dioverride di subclass. Ini berguna untuk memastikan perilaku yang konsisten atau untuk tujuan keamanan.
Q5: Apa yang terjadi jika kelas induk dan anak mendefinisikan field atau metode dengan nama yang sama?
A5: Jika sebuah field dengan nama yang sama didefinisikan di kedua kelas, field di kelas anak menyembunyikan yang ada di kelas induk (shadowing). Metode berperilaku berbeda: jika tanda tangan cocok, metode anak akan mengoverride metode induk. Perlu dicatat bahwa field tidak dapat dioverride—hanya dapat disembunyikan.
Q6: Apa yang terjadi jika kedalaman pewarisan menjadi terlalu besar?
A6: Hierarki pewarisan yang dalam membuat kode lebih sulit dipahami dan dipelihara. Menjadi sulit melacak di mana logika didefinisikan. Untuk desain yang dapat dipelihara, usahakan menjaga kedalaman pewarisan tetap dangkal dan peran-peran dipisahkan dengan jelas.
Q7: Apa perbedaan antara overriding dan overloading?
A7: Overriding mendefinisikan ulang sebuah metode dari kelas induk di kelas anak. Overloading mendefinisikan beberapa metode dalam kelas yang sama dengan nama yang sama tetapi tipe atau jumlah parameter yang berbeda.
Q8: Bagaimana cara penggunaan kelas abstrak dan antarmuka (interface) yang berbeda?
A8: Kelas abstrak digunakan ketika Anda ingin menyediakan implementasi atau field yang dibagikan di antara kelas-kelas yang terkait. Antarmuka (interface) digunakan ketika Anda ingin mendefinisikan kontrak perilaku yang dapat diimplementasikan oleh banyak kelas. Gunakan kelas abstrak untuk kode yang dibagikan dan gunakan antarmuka ketika mewakili banyak tipe atau ketika diperlukan banyak “kemampuan”.

