super () di Jawa

222

Apakah super()digunakan untuk memanggil orang tua konstruktor? Tolong jelaskan super().

Mohan
sumber
1
Harus lebih spesifik atau hanya membaca dokumentasinya ...
Manu
Sehubungan dengan panggilan super () periksa jawaban ini juga. stackoverflow.com/questions/34349164/…
Vishrant
Dijelaskan di sini: Jawa: Memanggil super ()
aioobe

Jawaban:

267

super() memanggil induk konstruktor tanpa argumen.

Dapat digunakan juga dengan argumen. Yaitu super(argument1)dan itu akan memanggil konstruktor yang menerima 1 parameter dari tipe argument1(jika ada).

Juga dapat digunakan untuk memanggil metode dari orang tua. Yaitusuper.aMethod()

Info lebih lanjut dan tutorial di sini

pakore
sumber
9
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:

  1. super() digunakan untuk memanggil orang tua langsung.
  2. super() dapat digunakan dengan anggota instance, yaitu variabel instan dan metode instance.
  3. 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

class Base
{
    int a = 100;
}

class Sup1 extends Base
{
    int a = 200;
    void Show()
    {
        System.out.println(a);
        System.out.println(a);
    }
    public static void main(String[] args)
    {
        new Sup1().Show();
    }
}

Keluaran:

200
200

Sekarang periksa program 2 dan coba cari tahu perbedaan utamanya.

Program 2

class Base
{
    int a = 100;
}

class Sup2 extends Base
{
    int a = 200;
    void Show()
    {
        System.out.println(super.a);
        System.out.println(a);
    }
    public static void main(String[] args)
    {
        new Sup2().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

class Base
{
    int a = 100;
    void Show()
    {
        System.out.println(a);
    }
}

class Sup3 extends Base
{
    int a = 200;
    void Show()
    {
        System.out.println(a);
    }
    public static void Main(String[] args)
    {
        new Sup3().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

class Base
{
    int a = 100;
    void Show()
    {
        System.out.println(a);
    }
}

class Sup4 extends Base
{
    int a = 200;
    void Show()
    {
        super.Show();
        System.out.println(a);
    }
    public static void Main(String[] args)
    {
        new Sup4().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.

SimonGates
sumber
4
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.
Marquis of Lorne
37

Sumber artikel: Java: Calling super ()


Iya. super(...)akan memanggil konstruktor kelas super.

Ilustrasi:

masukkan deskripsi gambar di sini


Contoh yang berdiri sendiri:

class Animal {
    public Animal(String arg) {
        System.out.println("Constructing an animal: " + arg);
    }
}

class Dog extends Animal {
    public Dog() {
        super("From Dog constructor");
        System.out.println("Constructing a dog.");
    }
}

public class Test {
    public static void main(String[] a) {
        new Dog();
    }
}

Cetakan:

Constructing an animal: From Dog constructor
Constructing a dog.
aioobe
sumber
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.

Inilah tutorial resmi

Heinzi
sumber
5
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.

class Explicit() {
    Explicit() {
        super();
    }
}

class Implicit {
    Implicit() {
    }
}
Roland Illig
sumber
Saya menemukan itu digunakan dalam beberapa kelas, tidak yakin apa tujuannya. Jawaban Anda sangat membantu.
iprashant
6

Ya, super()(huruf kecil) memanggil konstruktor dari kelas induk. Anda bisa memasukkan argumen:super(foo, bar)

Ada juga superkata kunci, yang dapat Anda gunakan dalam metode untuk memanggil metode dari superclass

Google cepat untuk "Java super" menghasilkan ini

Bozho
sumber
4

Itu betul. Super digunakan untuk memanggil konstruktor induk. Jadi misalkan Anda memiliki blok kode seperti itu

class A{
    int n;
    public A(int x){
        n = x;
    }
}

class B extends A{
    int m;
    public B(int x, int y){
        super(x);
        m = y;
    }
}

Kemudian Anda dapat menetapkan nilai ke variabel anggota n.

Sagar V
sumber
2

Saya telah melihat semua jawabannya. Tetapi semua orang lupa menyebutkan satu hal yang sangat penting:

super () harus dipanggil atau digunakan di baris pertama konstruktor.

Pritam Banerjee
sumber
1

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.

public class Alien{
   public Alien(){ //Default constructor is written out by user
   /** Implementation not shown…**/
   }
}

public class WeirdAlien extends Alien{
   public WeirdAlien(){
   super(); //calls the default constructor in Alien.
   }

}
TheArchon
sumber
Tanpa argumen .
Marquis of Lorne
1

Misalnya, dalam otomatisasi selenium, Anda memiliki PageObject yang dapat menggunakan konstruktor induknya seperti ini:

public class DeveloperSteps extends ScenarioSteps {

public DeveloperSteps(Pages pages) {
    super(pages);
}........
Todd Zhang
sumber
1

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:

class Vehicle 
{ 
    int maxSpeed = 120; 
} 

/* sub class Car extending vehicle */
class Car extends Vehicle 
{ 
    int maxSpeed = 180; 

    void display() 
    { 
        /* print maxSpeed of base class (vehicle) */
        System.out.println("Maximum Speed: " + super.maxSpeed); 
    } 
} 

/* Driver program to test */
class Test 
{ 
    public static void main(String[] args) 
    { 
        Car small = new Car(); 
        small.display(); 
    } 
} 

Keluaran:-

Maximum Speed: 120
  1. Penggunaan super dengan metode:
/* Base class Person */
class Person 
{ 
    void message() 
    { 
        System.out.println("This is person class"); 
    } 
} 

/* Subclass Student */
class Student extends Person 
{ 
    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 */
class Test 
{ 
    public static void main(String args[]) 
    { 
        Student s = new Student(); 

        // calling display() of Student 
        s.display(); 
    } 
}

Keluaran:-

This is student class
This is person class

3. Penggunaan super dengan konstruktor:

class Person 
{ 
    Person() 
    { 
        System.out.println("Person class Constructor"); 
    } 
} 

/* subclass Student extending the Person class */
class Student extends Person 
{ 
    Student() 
    { 
        // invoke or call parent class constructor 
        super(); 

        System.out.println("Student class Constructor"); 
    } 
} 

/* Driver program to test*/
class Test 
{ 
    public static void main(String[] args) 
    { 
        Student s = new Student(); 
    } 
} 

Keluaran:-

Person class Constructor
Student class Constructor
Gulsan Borbhuiya
sumber
0

Konstruktor
Dalam konstruktor, Anda dapat menggunakannya tanpa titik untuk memanggil konstruktor lain. supermemanggil konstruktor di superclass; thismemanggil konstruktor di kelas ini:

public MyClass(int a) {
  this(a, 5);  // Here, I call another one of this class's constructors.
}

public MyClass(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:

public String 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.

Olathe
sumber
0

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.

public class Box {

    int width;
    int height;
    int depth;

    Box(int w, int h, int d) {
        width = w;
        height = h;
        depth = d;
    }

    public static void main(String[] args){
        HeavyBox heavy = new HeavyBox(12, 32, 23, 13);
    }

}

class HeavyBox extends Box {

    int weight;

    HeavyBox(int w, int h, int d, int m) {

        //call the superclass constructor
        super(w, h, d);
        weight = m;
    }

}
Luchnik
sumber
0

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.

otoloye
sumber
0

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");
    }

    public static void main(String[] args) {
    C c1 = new C();
    }
} 

Output di atas akan:

Constructor A
Constructor B
Constructor C
Mark Burleigh
sumber