Dalam tutorial ini, kita akan belajar tentang kata kunci super di Java dengan bantuan contoh.
Kata super
kunci di Java digunakan dalam subclass untuk mengakses anggota superclass (atribut, konstruktor, dan metode).
Sebelum kita mempelajari tentang super
kata kunci, pastikan untuk mengetahui tentang warisan Java.
Penggunaan kata kunci super
- Untuk memanggil metode superclass yang diganti di subclass.
- Untuk mengakses atribut (bidang) dari superclass jika superclass dan subclass memiliki atribut dengan nama yang sama.
- Untuk memanggil superclass no-arg (default) atau konstruktor berparameter secara eksplisit dari konstruktor subclass.
Mari kita pahami masing-masing kegunaan ini.
1. Access Overridden Methods dari superclass
Jika metode dengan nama yang sama didefinisikan di superclass dan subclass, metode di subclass menimpa metode di superclass. Ini disebut metode overriding.
Contoh 1: Penimpaan metode
class Animal ( // overridden method public void display()( System.out.println("I am an animal"); ) ) class Dog extends Animal ( // overriding method @Override public void display()( System.out.println("I am a dog"); ) public void printMessage()( display(); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); dog1.printMessage(); ) )
Keluaran
Saya seekor anjing
Dalam contoh ini, dengan membuat objek dog1 dari kelas Dog, kita bisa memanggil metode printMessage () yang kemudian mengeksekusi display()
pernyataan tersebut.
Karena display()
didefinisikan di kedua kelas, metode subkelas Anjing menggantikan metode superkelas Hewan. Oleh karena itu, display()
subclass disebut.
Bagaimana jika metode superclass yang diganti harus dipanggil?
Kami menggunakan super.display()
jika metode yang diganti display()
dari superclass Animal perlu dipanggil.
Contoh 2: Super to Call Superclass Method
class Animal ( // overridden method public void display()( System.out.println("I am an animal"); ) ) class Dog extends Animal ( // overriding method @Override public void display()( System.out.println("I am a dog"); ) public void printMessage()( // this calls overriding method display(); // this calls overridden method super.display(); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); dog1.printMessage(); ) )
Keluaran
Saya seekor anjing, saya seekor binatang
Di sini, cara kerja program di atas.
2. Atribut Akses Superclass
Superkelas dan subkelas dapat memiliki atribut dengan nama yang sama. Kami menggunakan super
kata kunci untuk mengakses atribut superclass tersebut.
Contoh 3: Mengakses atribut superclass
class Animal ( protected String; ) class Dog extends Animal ( public String; public void printType() ( System.out.println("I am a " + type); System.out.println("I am an " + super.type); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); dog1.printType(); ) )
Keluaran :
Saya adalah mamalia, saya adalah binatang
Dalam contoh ini, kami telah mendefinisikan jenis bidang contoh yang sama di kedua superclass Animal dan subclass Dog.
Kami kemudian membuat objek dog1 dari kelas Dog. Kemudian, printType()
metode tersebut dipanggil menggunakan objek ini.
Di dalam printType()
fungsinya,
- type mengacu pada atribut dari subclass Dog.
- super.type mengacu pada atribut dari superclass Animal.
Oleh karena itu, System.out.println("I am a " + type);
cetakan saya adalah mamalia. Dan, System.out.println("I am an " + super.type);
cetakan saya adalah binatang.
3. Penggunaan super () untuk mengakses konstruktor superclass
Seperti yang kita ketahui, ketika sebuah objek kelas dibuat, konstruktor defaultnya secara otomatis dipanggil.
Untuk memanggil konstruktor superclass secara eksplisit dari konstruktor subclass, kami menggunakan super()
. Ini adalah bentuk khusus dari super
kata kunci.
super()
hanya dapat digunakan di dalam konstruktor subclass dan harus menjadi pernyataan pertama.
Contoh 4: Penggunaan super ()
class Animal ( // default or no-arg constructor of class Animal Animal() ( System.out.println("I am an animal"); ) ) class Dog extends Animal ( // default or no-arg constructor of class Dog Dog() ( // calling default constructor of the superclass super(); System.out.println("I am a dog"); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); ) )
Keluaran
Saya seekor binatang, saya seekor anjing
Di sini, ketika objek dog1 dari kelas Dog dibuat, secara otomatis memanggil konstruktor default atau tanpa argumen dari kelas itu.
Di dalam konstruktor subclass, super()
pernyataan memanggil konstruktor superclass dan menjalankan pernyataan di dalamnya. Oleh karena itu, kami mendapatkan keluaran I am a animal.
Alur program kemudian kembali ke konstruktor subclass dan mengeksekusi pernyataan yang tersisa. Jadi, saya anjing akan dicetak.
Namun, menggunakan super()
tidak wajib. Bahkan jika super()
tidak digunakan dalam konstruktor subclass, compiler secara implisit memanggil konstruktor default dari superclass.
Jadi, mengapa menggunakan kode redundan jika compiler secara otomatis memanggil super ()?
Ini diperlukan jika konstruktor berparameterisasi (konstruktor yang mengambil argumen) dari superclass harus dipanggil dari konstruktor subclass.
Parameterized super()
harus selalu menjadi pernyataan pertama dalam tubuh konstruktor subclass, jika tidak, kita mendapatkan kesalahan kompilasi.
Contoh 5: Panggil Pembuat Parameter Menggunakan super ()
class Animal ( // default or no-arg constructor Animal() ( System.out.println("I am an animal"); ) // parameterized constructor Animal(String type) ( System.out.println("Type: "+type); ) ) class Dog extends Animal ( // default constructor Dog() ( // calling parameterized constructor of the superclass super("Animal"); System.out.println("I am a dog"); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); ) )
Keluaran
Jenis: Hewan Saya seekor anjing
Kompilator dapat secara otomatis memanggil konstruktor no-arg. Namun, itu tidak dapat memanggil konstruktor berparameter.
Jika konstruktor berparameter harus dipanggil, kita perlu mendefinisikannya secara eksplisit dalam konstruktor subclass.
Perhatikan bahwa dalam contoh di atas, kami secara eksplisit memanggil konstruktor berparameter super("Animal")
. Kompilator tidak memanggil konstruktor default dari superclass dalam kasus ini.