Java'da super ()


Yanıtlar:


267

super() üst yapıcıyı argüman olmadan çağırır.

Bağımsız değişkenlerle de kullanılabilir. Yani super(argument1)ve türünün argument1(varsa) 1 parametresini kabul eden yapıcıyı çağıracaktır .

Ayrıca ebeveynin yöntemlerini çağırmak için kullanılabilir. yanisuper.aMethod()

Daha fazla bilgi ve eğitim burada


9
Not: ilk durumda, üst sınıf derleme hatası atacak başarısız argüman yapıcı olmalıdır.
KNU

Nit: Ebeveyn / çocuk terminolojisi sınıf hiyerarşileri için pek iyi değil. (Bir çocuk baba değildir .)
aioobe

Süper'nin nerede kullanılabileceği konusunda herhangi bir kısıtlama var mı?
Aaron Franke

2
@VivekChavda, bir çocuğun ebeveyn olabileceğinden emin olabilirsiniz , tıpkı bir öğrencinin öğretmen olabileceği gibi. Ama örneğin Hayvan -> Köpek ile karşılaştırıldığında farkı anladığınızı düşünüyorum. Bir Köpek mutlaka bir Hayvan. Ebeveyn / çocuk genellikle bir sahip ilişkiyi ( "Bir ebeveyn bir sahip bir hayvan / köpek bir iken çocuk") "bir olan" ilişkisi. Bkz. Aioo.be/2016/06/29/a-child-is-not-always-a-parent.html
aioobe 16:17

2
@AaronFranke, "Süper nerede kullanılabileceği konusunda herhangi bir kısıtlama var mı?" - Evet, super(...)yalnızca bir kurucudaki ilk ifade olarak kullanılabilir.
aioobe

154

Bazı gerçekler:

  1. super() , üst ebeveyni aramak için kullanılır.
  2. super() örnek üyeleriyle, örneğin örnek değişkenleri ve örnek yöntemleri ile kullanılabilir.
  3. super() üst sınıfın yapıcısını çağırmak için bir kurucu içinde kullanılabilir.

Tamam, şimdi pratikte bu noktaları uygulayalım super().

Program 1 ve 2 arasındaki farkı kontrol edin. Burada, program 2 super()Java'daki ilk ifademizi kanıtlar .

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

Çıktı:

200
200

Şimdi program 2'ye bakın ve ana farkı anlamaya çalışın.

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

Çıktı:

100
200

Program 1'de çıktı sadece türetilmiş sınıftan alınmıştır. Ne taban sınıfın ne de üst sınıfın değişkenini yazdıramadı. Ancak programın 2'de, kullanılan super()değişken aüretimini baskı ve bunun yerine değişkeninin değerinin baskı sırasında atüretilmiş bir sınıf, bu değişkenin değeri basılı atemel sınıf. Böylece super(), ebeveynin derhal çağrıldığını kanıtlar .

Tamam, şimdi program 3 ve program 4 arasındaki farkı kontrol edin.

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

Çıktı:

200

Burada çıkış biz çağrıldığında 200 olduğunu Show(), Show()türetilmiş sınıfın fonksiyonu olarak adlandırıldı. Ancak Show()ana sınıfın işlevini çağırmak istiyorsak ne yapmalıyız ? Çözüm için program 4'e bakın.

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

Çıktı:

100
200

Burada iki çıkış alıyoruz, 100 ve 200. Show()Türetilmiş sınıfın işlevi çağrıldığında, önce Show()üst sınıfın işlevini çağırır , çünkü Show()türetilmiş sınıfın Show()işlevi içinde, üst sınıfın işlevini superişlev adından önceki anahtar sözcük.


4
Kaynak kodu örneklerinizi neden girintilemediniz? Belirli bir nedeni var mı?
erikbwork

HAYIR erikb, super () kullanımını bilmek istiyorum. Ahiret sadece ben gidiyorum
Mohan

Benim temel sınıfta bir, iki, ... argüman ile yapıcı aşırı
yüklüyorum

ama türetilmiş sınıfımda herhangi bir argüman olmadan super () kullanıyorum. otomatik olarak bir temel sınıfın varsayılan kurucusunu çağırıyorsa ne olur
Mohan

2
super()bir anahtar kelime değil. Bir yapıcı çağrımıdır. superbir anahtar kelimedir ve # 1 ve # 2 yalnızca bu tanımla anlamlıdır.
Lorne Marquis

37

Kaynak makale: Java: Calling super ()


Evet. super(...)süper sınıfın yapıcısını çağırır.

İllüstrasyon:

resim açıklamasını buraya girin


Bağımsız örnek:

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

Baskılar:

Constructing an animal: From Dog constructor
Constructing a dog.

Benim temel sınıfta ben türetilmiş sınıfta bir, iki, ... argüman ile yapıcı aşırı yük ben herhangi bir arg olmadan super () kullanın. otomatik olarak bir temel sınıfın varsayılan kurucusunu çağırıyorsa ne olur
Mohan

Evet. Eğer çağırırsanız super(), hiçbir argüman almayan süper sınıfın yapıcısını çağırır. Benzer şekilde, böyle yaparsanız 1 bağımsız değişken yapıcısını çağırır super(arg1).
aioobe

temel sınıfta herhangi bir argüman olmadan yapıcı yoksa, türetilmiş sınıf super () çağırırsa ne olur.
Mohan

1
Hiçbir şey değil. Derlenmeyecek. Bir kurucuyu kendiniz sağlarsanız, otomatik / varsayılan / bağımsız değişken oluşturucu oluşturulmaz, dolayısıyla super()geçerli bir çağrı olmaz.
aioobe

29

Üst yapıcıyı çağırmak için super () kullanılır mı?

Evet.

Pls Süper () hakkında açıklar.

super()superparametresiz bir üst yapıcı çağırdığınız anahtar kelimenin özel bir kullanımıdır . Genel olarak, superanahtar kelime geçersiz kılınan yöntemleri çağırmak, gizli alanlara erişmek veya bir üst sınıf yapıcısını çağırmak için kullanılabilir.

İşte resmi eğitim


5
super()üst super.myMethod()yapıcıyı çağırmak için kullanılır, geçersiz kılınmış bir yöntemi çağırmak için kullanılır.
Sean Patrick Floyd

2
@seanizer veya kapsam dahilindeyse üst sınıfın herhangi bir yöntemi (statik dahil). super sadece temel sınıfınıza referanstır.
atamanroman

3
Ben süper () temel sınıf yöntemleri çağırmak için kullanılır sanmıyorum. Yine de super.method () kullanabilirsiniz.
Dheeraj Joshi

@seanizer, @Dheeraj: Geri bildiriminiz için teşekkürler, cevabımı uyarladım.
Heinzi

7

Bağımsız değişken olmayan süper kurucu olarak adlandırmak sadece ekran alanı ve programcı zaman kaybıdır. Derleyici, yazsanız da yazmasanız da tam olarak aynı kodu üretir.

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

class Implicit {
    Implicit() {
    }
}

Birkaç sınıfta kullanıldığını gördüm, amacın ne olduğundan emin değilim. Cevabınız faydalı.
iprashant

6

Evet, super()(küçük harf) üst sınıfın yapıcısını çağırır. Bağımsız değişkenler ekleyebilirsiniz:super(foo, bar)

superÜst sınıfın bir yöntemini çağırmak için yöntemlerde kullanabileceğiniz bir anahtar kelime de vardır

"Java super" için hızlı bir google bu


4

Bu doğru. Süper, üst yapıcıyı çağırmak için kullanılır. Diyelim ki böyle bir kod bloğunuz var

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

Daha sonra n üye değişkenine bir değer atayabilirsiniz.


2

Bütün cevapları gördüm. Ancak herkes çok önemli bir noktadan bahsetmeyi unuttu:

super (), kurucunun ilk satırında çağrılmalı veya kullanılmalıdır.


1

Sadece süper (); tek başına bir sınıfın üst sınıfından varsa varsayılan kurucuyu çağırır. Ancak, varsayılan kurucuyu kendiniz açıkça yazmalısınız. Bir Java kullanmazsanız, sizin için hiçbir uygulama olmadan bir tane oluşturur, super (); , evrensel Üst Sınıf Nesnesi'ne atıfta bulunursanız, bunu alt sınıfta çağıramazsınız.

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

}

Hiçbir argüman olmadan .
Lorne Marquis

1

Örneğin, selenyum otomasyonunda, üst öğesinin yapıcısını şu şekilde kullanabilen bir PageObject öğeniz vardır:

public class DeveloperSteps extends ScenarioSteps {

public DeveloperSteps(Pages pages) {
    super(pages);
}........

1

Anladığım her şeyi kodlarla paylaşmak istiyorum.

Java'daki süper anahtar sözcük, üst sınıf nesnelerine başvurmak için kullanılan bir başvuru değişkenidir. Büyük ölçüde aşağıdaki bağlamlarda kullanılır: -

1. super değişkenleri ile kullanımı:

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

Çıktı:-

Maximum Speed: 120
  1. Süper yöntemlerle kullanımı:
/* 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(); 
    } 
}

Çıktı:-

This is student class
This is person class

3. süper yapıcılar ile kullanımı:

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

Çıktı:-

Person class Constructor
Student class Constructor

0

Yapıcılar
Bir kurucuda, başka bir kurucu çağırmak için onu nokta olmadan kullanabilirsiniz. superüst sınıfta bir kurucu çağırır; thisbu sınıfta bir kurucu çağırır:

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

superüst sınıfın kendini başlatması gerekiyorsa yararlıdır. thistüm zor başlatma kodunu kuruculardan birine yalnızca bir kez yazmanıza ve diğer tüm yazması daha kolay kuruculardan çağırmanıza olanak tanır.

Yöntemler
Herhangi bir yöntemde, başka bir yöntemi çağırmak için bir nokta ile kullanabilirsiniz. super.method()üst sınıfta bir yöntemi çağırır; this.method()bu sınıftaki bir yöntemi çağırır:

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

superbelirli bir senaryoda yararlıdır: sınıfınız üst sınıfınızla aynı yönteme sahipse, Java sınıfınızda olanı istediğinizi varsayar; superbunun yerine üst sınıfın yöntemini sormanızı sağlar. thisyalnızca kodunuzu daha okunaklı hale getirmenin bir yolu olarak kullanışlıdır.


0

Süper anahtar kelime üst sınıf kurucusunu çağırmak için ve üst sınıf bir üyesi başvurmak için kullanılabilir

Aradığınızda () süper doğru argümanlarla, aslında kurucusunu çağırmak Kutu değişkenleri başlatır, genişlik , yükseklik ve derinlik gelen parametre değerlerini kullanarak kendisine gönderilen,. Sadece katma değer ağırlığını başlatmak için kalırsınız. Gerekirse, artık Box değişkenlerini özel olarak sınıflandırabilirsiniz . Box sınıfı özel değiştiricisinin alanlarına koyun ve bunlara sorunsuz bir şekilde erişebildiğinizden emin olun.

Üst sınıfta aşırı yüklenmiş sürüm yapıcıları olabilir, bu nedenle yöntemi farklı parametrelerle super () olarak çağırabilirsiniz . Program, belirtilen bağımsız değişkenlerle eşleşen yapıcıyı gerçekleştirir.

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

}

0

super bir anahtar kelimedir. Üst sınıfta tanımlanan bir yöntemi çağırmak için bir alt sınıf yöntemi tanımının içinde kullanılır. Üst sınıfın özel yöntemleri çağrılamaz. Süper anahtar kelime tarafından yalnızca herkese açık ve korunan yöntemler çağrılabilir. Ayrıca sınıf yapıcılar tarafından üst sınıfının yapıcılarını çağırmak için kullanılır.

Kontrol burada daha fazla açıklama için.


0

Belirtildiği gibi, varsayılan kurucu içinde kurucunun ilk satırında çağrılan örtük bir super () vardır .

Bu super () otomatik olarak sınıf hiyerarşisinin en üstünde başlayan bir yapıcı zincirini çağırır ve hiyerarşiyi aşağı taşır.

Olsaydı ikiden fazla sınıfları programın sınıf hiyerarşisinde, üst sınıf varsayılan yapıcı alacağı denilen ilk .

İşte bunun bir örneği:

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

Yukarıdaki çıktı:

Constructor A
Constructor B
Constructor C
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.