CATATAN: dalam kasus pertama, kelas induk harus memiliki konstruktor tanpa argumen yang gagal yang akan menyebabkan kesalahan kompilasi.
KNU
Nit: Terminologi induk / anak tidak terlalu baik untuk hierarki kelas. (Seorang anak bukan ayah.)
aioobe
Apakah ada batasan di mana super dapat digunakan?
Aaron Franke
2
@VivekChavda, tentu saja seorang anak dapat menjadi orang tua, seperti halnya seorang siswa dapat menjadi guru, dll. Tapi saya pikir Anda memahami perbedaannya dibandingkan dengan Hewan -> Anjing misalnya. Seekor Anjing tentu saja Hewan. Orang tua / anak biasanya memiliki hubungan ("Orang tua memiliki anak") sedangkan Hewan / anjing adalah hubungan "adalah" . Lihat aioo.be/2016/06/29/a-child-is-not-always-a-parent.html
aioobe
2
@AaronFranke, "Apakah ada batasan di mana super dapat digunakan?" - Ya, super(...)hanya dapat digunakan sebagai pernyataan pertama dalam konstruktor.
aioobe
154
Beberapa fakta:
super() digunakan untuk memanggil orang tua langsung.
super() dapat digunakan dengan anggota instance, yaitu variabel instan dan metode instance.
super() dapat digunakan dalam konstruktor untuk memanggil konstruktor dari kelas induk.
OK, sekarang mari kita secara praktis mengimplementasikan poin-poin ini super().
Lihat perbedaan antara program 1 dan 2. Di sini, program 2 membuktikan pernyataan pertama kami super()di Jawa.
Program 1
classBase{int a =100;}classSup1extendsBase{int a =200;voidShow(){System.out.println(a);System.out.println(a);}publicstaticvoid main(String[] args){newSup1().Show();}}
Keluaran:
200
200
Sekarang periksa program 2 dan coba cari tahu perbedaan utamanya.
Program 2
classBase{int a =100;}classSup2extendsBase{int a =200;voidShow(){System.out.println(super.a);System.out.println(a);}publicstaticvoid main(String[] args){newSup2().Show();}}
Keluaran:
100
200
Dalam program 1, output hanya dari kelas turunan. Itu tidak bisa mencetak variabel baik kelas dasar maupun kelas induk. Namun dalam program 2, kami menggunakan super()variabel asaat mencetak outputnya, dan alih-alih mencetak nilai variabel adari kelas turunan, ia mencetak nilai variabel adari kelas dasar. Jadi itu membuktikan yang super()digunakan untuk memanggil orang tua langsung.
OK, sekarang periksa perbedaan antara program 3 dan program 4.
Program 3
classBase{int a =100;voidShow(){System.out.println(a);}}classSup3extendsBase{int a =200;voidShow(){System.out.println(a);}publicstaticvoidMain(String[] args){newSup3().Show();}}
Keluaran:
200
Di sini outputnya adalah 200. Ketika kami memanggil Show(), Show()fungsi dari kelas turunan dipanggil. Tetapi apa yang harus kita lakukan jika kita ingin memanggil Show()fungsi kelas induk? Lihat program 4 untuk solusinya.
Program 4
classBase{int a =100;voidShow(){System.out.println(a);}}classSup4extendsBase{int a =200;voidShow(){super.Show();System.out.println(a);}publicstaticvoidMain(String[] args){newSup4().Show();}}
Keluaran:
100
200
Di sini kita mendapatkan dua output, 100 dan 200. Ketika Show()fungsi kelas turunan dipanggil, pertama-tama memanggil Show()fungsi kelas induk, karena di dalam Show()fungsi kelas turunan, kita memanggil Show()fungsi kelas induk dengan meletakkan yang superkata kunci sebelum nama fungsi.
Mengapa Anda tidak memasukkan contoh kode sumber Anda? Apakah ada alasan khusus?
erikbwork
TIDAK erikb, saya ingin tahu penggunaan super (). Selanjutnya hanya saya yang akan
Mohan
Di kelas dasar saya, saya membebani konstruktor dengan satu, dua, ... argumen
Mohan
tetapi di kelas turunan saya, saya menggunakan super () tanpa argu. lalu apa yang akan terjadi apakah itu secara otomatis memanggil konstruktor default dari kelas dasar
Mohan
2
super()bukan kata kunci. Ini adalah permohonan konstruktor. superadalah kata kunci, dan # 1 dan # 2 hanya masuk akal dengan definisi itu.
Iya. super(...)akan memanggil konstruktor kelas super.
Ilustrasi:
Contoh yang berdiri sendiri:
classAnimal{publicAnimal(String arg){System.out.println("Constructing an animal: "+ arg);}}classDogextendsAnimal{publicDog(){super("From Dog constructor");System.out.println("Constructing a dog.");}}publicclassTest{publicstaticvoid main(String[] a){newDog();}}
Cetakan:
Constructing an animal:FromDog constructor
Constructing a dog.
Di kelas dasar saya, saya membebani konstruktor dengan satu, dua, ... argumen di kelas turunan saya menggunakan super () tanpa argu. lalu apa yang akan terjadi apakah itu secara otomatis memanggil konstruktor default dari kelas dasar
Mohan
Iya. Jika Anda memanggilnya super()akan memanggil konstruktor kelas-super yang tidak membutuhkan argumen. Demikian pula, itu akan memanggil konstruktor 1-argumen jika Anda melakukannya super(arg1), dan seterusnya.
aioobe
jika tidak ada konstruktor tanpa argu di kelas dasar maka apa yang terjadi jika kelas turunan memanggil super ().
Mohan
1
Tidak ada. Itu tidak akan dikompilasi. Jika Anda menyediakan konstruktor sendiri, konstruktor otomatis / default / no-argumen-tidak akan dihasilkan, sehingga super()tidak akan menjadi panggilan yang valid.
aioobe
29
Apakah super () digunakan untuk memanggil konstruktor induk?
Iya.
Tolong jelaskan tentang Super ().
super()adalah penggunaan khusus superkata kunci tempat Anda memanggil konstruktor induk tanpa parameter. Secara umum, superkata kunci dapat digunakan untuk memanggil metode yang diganti, mengakses bidang tersembunyi atau memanggil konstruktor superclass.
super()digunakan untuk memanggil konstruktor induk, super.myMethod()digunakan untuk memanggil metode yang diganti.
Sean Patrick Floyd
2
@seanizer atau metode superclass lainnya (termasuk statika) jika berada dalam ruang lingkup. Super hanyalah referensi ke kelas dasar Anda.
atamanroman
3
Saya tidak berpikir super () digunakan untuk memanggil metode kelas dasar. Anda dapat menggunakan super.method ().
Dheeraj Joshi
@seanizer, @Dheeraj: Terima kasih atas tanggapan Anda, saya telah mengadaptasi jawaban saya.
Heinzi
7
Memanggil konstruktor tanpa-argumen super hanya membuang-buang ruang layar dan waktu programmer. Kompiler menghasilkan kode yang persis sama, baik Anda menulisnya atau tidak.
Hanya super (); sendiri akan memanggil konstruktor default, jika ada superclass kelas. Tetapi Anda harus secara eksplisit menulis konstruktor default sendiri. Jika Anda tidak, Java akan menghasilkan satu untuk Anda tanpa implementasi, save super (); , mengacu pada Obyek Superclass universal, dan Anda tidak dapat menyebutnya dalam subkelas.
publicclassAlien{publicAlien(){//Default constructor is written out by user/** Implementation not shown…**/}}publicclassWeirdAlienextendsAlien{publicWeirdAlien(){super();//calls the default constructor in Alien.}}
Saya ingin berbagi dengan kode apa pun yang saya mengerti.
Kata kunci super di java adalah variabel referensi yang digunakan untuk merujuk objek kelas induk. Ini sebagian besar digunakan dalam konteks berikut: -
1. Penggunaan super dengan variabel:
classVehicle{int maxSpeed =120;}/* sub class Car extending vehicle */classCarextendsVehicle{int maxSpeed =180;void display(){/* print maxSpeed of base class (vehicle) */System.out.println("Maximum Speed: "+super.maxSpeed);}}/* Driver program to test */classTest{publicstaticvoid main(String[] args){Car small =newCar();
small.display();}}
Keluaran:-
MaximumSpeed:120
Penggunaan super dengan metode:
/* Base class Person */classPerson{void message(){System.out.println("This is person class");}}/* Subclass Student */classStudentextendsPerson{void message(){System.out.println("This is student class");}// Note that display() is only in Student class void display(){// will invoke or call current class message() method
message();// will invoke or call parent class message() method super.message();}}/* Driver program to test */classTest{publicstaticvoid main(String args[]){Student s =newStudent();// calling display() of Student
s.display();}}
Keluaran:-
This is student classThis is person class
3. Penggunaan super dengan konstruktor:
classPerson{Person(){System.out.println("Person class Constructor");}}/* subclass Student extending the Person class */classStudentextendsPerson{Student(){// invoke or call parent class constructor super();System.out.println("Student class Constructor");}}/* Driver program to test*/classTest{publicstaticvoid main(String[] args){Student s =newStudent();}}
Konstruktor
Dalam konstruktor, Anda dapat menggunakannya tanpa titik untuk memanggil konstruktor lain. supermemanggil konstruktor di superclass; thismemanggil konstruktor di kelas ini:
publicMyClass(int a){this(a,5);// Here, I call another one of this class's constructors.}publicMyClass(int a,int b){super(a, b);// Then, I call one of the superclass's constructors.}
superberguna jika superclass perlu diinisialisasi sendiri. thisberguna untuk memungkinkan Anda untuk menulis semua kode inisialisasi keras hanya sekali di salah satu konstruktor dan memanggilnya dari semua yang lain, jauh lebih mudah untuk menulis konstruktor.
Metode
Dalam metode apa pun, Anda dapat menggunakannya dengan titik untuk memanggil metode lain. super.method()memanggil metode dalam superclass; this.method()memanggil metode di kelas ini:
publicString toString(){int hp =this.hitpoints();// Calls the hitpoints method in this class// for this object.String name =super.name();// Calls the name method in the superclass// for this object.return"["+ name +": "+ hp +" HP]";}
superberguna dalam skenario tertentu: jika kelas Anda memiliki metode yang sama dengan superclass Anda, Java akan menganggap Anda menginginkan yang ada di kelas Anda; supermemungkinkan Anda untuk meminta metode superclass. thishanya berguna sebagai cara untuk membuat kode Anda lebih mudah dibaca.
Kata kunci super dapat digunakan untuk memanggil konstruktor superclass dan merujuk ke anggota superclass
Saat Anda memanggil super () dengan argumen yang benar, kami sebenarnya memanggil Kotak konstruktor , yang menginisialisasi variabel lebar , tinggi dan kedalaman , merujuknya dengan menggunakan nilai-nilai parameter yang sesuai. Anda tinggal menginisialisasi bobot nilai tambahnya. Jika perlu, Anda dapat melakukan sekarang variabel Box kelas sebagai pribadi . Letakkan di bidang pengubah pribadi kelas Box dan pastikan bahwa Anda dapat mengaksesnya tanpa masalah.
Pada superclass dapat ada beberapa konstruktor versi kelebihan beban, sehingga Anda dapat memanggil metode super () dengan parameter yang berbeda. Program akan melakukan konstruktor yang cocok dengan argumen yang ditentukan.
Super adalah kata kunci. Ini digunakan di dalam definisi metode sub-kelas untuk memanggil metode yang didefinisikan dalam superclass. Metode pribadi superclass tidak dapat dipanggil. Hanya metode publik dan yang dilindungi yang dapat dipanggil oleh kata kunci super. Ini juga digunakan oleh konstruktor kelas untuk memanggil konstruktor dari kelas induknya.
Seperti yang dinyatakan, di dalam konstruktor default ada super implisit () dipanggil pada baris pertama konstruktor.
Super () ini secara otomatis memanggil rantai konstruktor mulai dari atas hierarki kelas dan bergerak ke bawah hierarki.
Jika ada lebih dari dua kelas dalam hirarki kelas program, konstruktor default kelas atas akan dipanggil terlebih dahulu .
Berikut ini contohnya:
class A {
A(){System.out.println("Constructor A");}}class B extends A{public B(){System.out.println("Constructor B");}}class C extends B{public C(){System.out.println("Constructor C");}publicstaticvoid main(String[] args){
C c1 =new C();}}
Jawaban:
super()
memanggil induk konstruktor tanpa argumen.Dapat digunakan juga dengan argumen. Yaitu
super(argument1)
dan itu akan memanggil konstruktor yang menerima 1 parameter dari tipeargument1
(jika ada).Juga dapat digunakan untuk memanggil metode dari orang tua. Yaitu
super.aMethod()
Info lebih lanjut dan tutorial di sini
sumber
super(...)
hanya dapat digunakan sebagai pernyataan pertama dalam konstruktor.Beberapa fakta:
super()
digunakan untuk memanggil orang tua langsung.super()
dapat digunakan dengan anggota instance, yaitu variabel instan dan metode instance.super()
dapat digunakan dalam konstruktor untuk memanggil konstruktor dari kelas induk.OK, sekarang mari kita secara praktis mengimplementasikan poin-poin ini
super()
.Lihat perbedaan antara program 1 dan 2. Di sini, program 2 membuktikan pernyataan pertama kami
super()
di Jawa.Program 1
Keluaran:
Sekarang periksa program 2 dan coba cari tahu perbedaan utamanya.
Program 2
Keluaran:
Dalam program 1, output hanya dari kelas turunan. Itu tidak bisa mencetak variabel baik kelas dasar maupun kelas induk. Namun dalam program 2, kami menggunakan
super()
variabela
saat mencetak outputnya, dan alih-alih mencetak nilai variabela
dari kelas turunan, ia mencetak nilai variabela
dari kelas dasar. Jadi itu membuktikan yangsuper()
digunakan untuk memanggil orang tua langsung.OK, sekarang periksa perbedaan antara program 3 dan program 4.
Program 3
Keluaran:
Di sini outputnya adalah 200. Ketika kami memanggil
Show()
,Show()
fungsi dari kelas turunan dipanggil. Tetapi apa yang harus kita lakukan jika kita ingin memanggilShow()
fungsi kelas induk? Lihat program 4 untuk solusinya.Program 4
Keluaran:
Di sini kita mendapatkan dua output, 100 dan 200. Ketika
Show()
fungsi kelas turunan dipanggil, pertama-tama memanggilShow()
fungsi kelas induk, karena di dalamShow()
fungsi kelas turunan, kita memanggilShow()
fungsi kelas induk dengan meletakkan yangsuper
kata kunci sebelum nama fungsi.sumber
super()
bukan kata kunci. Ini adalah permohonan konstruktor.super
adalah kata kunci, dan # 1 dan # 2 hanya masuk akal dengan definisi itu.Sumber artikel: Java: Calling super ()
Iya.
super(...)
akan memanggil konstruktor kelas super.Ilustrasi:
Contoh yang berdiri sendiri:
Cetakan:
sumber
super()
akan memanggil konstruktor kelas-super yang tidak membutuhkan argumen. Demikian pula, itu akan memanggil konstruktor 1-argumen jika Anda melakukannyasuper(arg1)
, dan seterusnya.super()
tidak akan menjadi panggilan yang valid.Iya.
super()
adalah penggunaan khusussuper
kata kunci tempat Anda memanggil konstruktor induk tanpa parameter. Secara umum,super
kata kunci dapat digunakan untuk memanggil metode yang diganti, mengakses bidang tersembunyi atau memanggil konstruktor superclass.Inilah tutorial resmi
sumber
super()
digunakan untuk memanggil konstruktor induk,super.myMethod()
digunakan untuk memanggil metode yang diganti.Memanggil konstruktor tanpa-argumen super hanya membuang-buang ruang layar dan waktu programmer. Kompiler menghasilkan kode yang persis sama, baik Anda menulisnya atau tidak.
sumber
Ya,
super()
(huruf kecil) memanggil konstruktor dari kelas induk. Anda bisa memasukkan argumen:super(foo, bar)
Ada juga
super
kata kunci, yang dapat Anda gunakan dalam metode untuk memanggil metode dari superclassGoogle cepat untuk "Java super" menghasilkan ini
sumber
Itu betul. Super digunakan untuk memanggil konstruktor induk. Jadi misalkan Anda memiliki blok kode seperti itu
Kemudian Anda dapat menetapkan nilai ke variabel anggota n.
sumber
Saya telah melihat semua jawabannya. Tetapi semua orang lupa menyebutkan satu hal yang sangat penting:
super () harus dipanggil atau digunakan di baris pertama konstruktor.
sumber
Hanya super (); sendiri akan memanggil konstruktor default, jika ada superclass kelas. Tetapi Anda harus secara eksplisit menulis konstruktor default sendiri. Jika Anda tidak, Java akan menghasilkan satu untuk Anda tanpa implementasi, save super (); , mengacu pada Obyek Superclass universal, dan Anda tidak dapat menyebutnya dalam subkelas.
sumber
Misalnya, dalam otomatisasi selenium, Anda memiliki PageObject yang dapat menggunakan konstruktor induknya seperti ini:
sumber
Saya ingin berbagi dengan kode apa pun yang saya mengerti.
Kata kunci super di java adalah variabel referensi yang digunakan untuk merujuk objek kelas induk. Ini sebagian besar digunakan dalam konteks berikut: -
1. Penggunaan super dengan variabel:
Keluaran:-
Keluaran:-
3. Penggunaan super dengan konstruktor:
Keluaran:-
sumber
Konstruktor
Dalam konstruktor, Anda dapat menggunakannya tanpa titik untuk memanggil konstruktor lain.
super
memanggil konstruktor di superclass;this
memanggil konstruktor di kelas ini:super
berguna jika superclass perlu diinisialisasi sendiri.this
berguna untuk memungkinkan Anda untuk menulis semua kode inisialisasi keras hanya sekali di salah satu konstruktor dan memanggilnya dari semua yang lain, jauh lebih mudah untuk menulis konstruktor.Metode
Dalam metode apa pun, Anda dapat menggunakannya dengan titik untuk memanggil metode lain.
super.method()
memanggil metode dalam superclass;this.method()
memanggil metode di kelas ini:super
berguna dalam skenario tertentu: jika kelas Anda memiliki metode yang sama dengan superclass Anda, Java akan menganggap Anda menginginkan yang ada di kelas Anda;super
memungkinkan Anda untuk meminta metode superclass.this
hanya berguna sebagai cara untuk membuat kode Anda lebih mudah dibaca.sumber
Kata kunci super dapat digunakan untuk memanggil konstruktor superclass dan merujuk ke anggota superclass
Saat Anda memanggil super () dengan argumen yang benar, kami sebenarnya memanggil Kotak konstruktor , yang menginisialisasi variabel lebar , tinggi dan kedalaman , merujuknya dengan menggunakan nilai-nilai parameter yang sesuai. Anda tinggal menginisialisasi bobot nilai tambahnya. Jika perlu, Anda dapat melakukan sekarang variabel Box kelas sebagai pribadi . Letakkan di bidang pengubah pribadi kelas Box dan pastikan bahwa Anda dapat mengaksesnya tanpa masalah.
Pada superclass dapat ada beberapa konstruktor versi kelebihan beban, sehingga Anda dapat memanggil metode super () dengan parameter yang berbeda. Program akan melakukan konstruktor yang cocok dengan argumen yang ditentukan.
sumber
Super adalah kata kunci. Ini digunakan di dalam definisi metode sub-kelas untuk memanggil metode yang didefinisikan dalam superclass. Metode pribadi superclass tidak dapat dipanggil. Hanya metode publik dan yang dilindungi yang dapat dipanggil oleh kata kunci super. Ini juga digunakan oleh konstruktor kelas untuk memanggil konstruktor dari kelas induknya.
Periksa di sini untuk penjelasan lebih lanjut.
sumber
Seperti yang dinyatakan, di dalam konstruktor default ada super implisit () dipanggil pada baris pertama konstruktor.
Super () ini secara otomatis memanggil rantai konstruktor mulai dari atas hierarki kelas dan bergerak ke bawah hierarki.
Jika ada lebih dari dua kelas dalam hirarki kelas program, konstruktor default kelas atas akan dipanggil terlebih dahulu .
Berikut ini contohnya:
Output di atas akan:
sumber