Java에서 super ()


답변:


267

super() 인수없이 부모 생성자를 호출합니다.

인수와 함께 사용할 수도 있습니다. 즉 super(argument1), 유형의 매개 변수 1을 허용하는 생성자를 호출합니다.argument1 (있는 경우) .

또한 부모로부터 메소드를 호출하는 데 사용될 수 있습니다. 즉super.aMethod()

더 많은 정보와 튜토리얼은 여기


9
참고 : 첫 번째 경우 부모 클래스에는 인수 생성자가 실패해야 컴파일 오류가 발생합니다.
KNU

Nit : 부모 / 자식 용어는 클래스 계층 구조에 적합하지 않습니다. (아이 아버지 가 아닙니다 .)
aioobe

super를 사용할 수있는 곳에 제한이 있습니까?
Aaron Franke

2
@VivekChavda, 학생이 교사가 될 수있는 것처럼 자녀 부모 있는지 확인하십시오 . 그러나 예를 들어 Animal-> Dog와의 차이점을 이해한다고 생각합니다. 개는 반드시 동물입니다. 부모 / 자녀는 일반적으로 관계 가 있으며 ( "부모 자녀가 있습니다") 동물 / 개는 "is" 관계입니다. aioo.be/2016/06/29/a-child-is-not-always-a-parent.html
aioobe

2
@AaronFranke, "슈퍼를 사용할 수있는 곳에 제한이 있습니까?" -예 super(...). 생성자의 첫 번째 문장으로 만 사용할 수 있습니다.
aioobe

154

몇 가지 사실 :

  1. super() 직계 부모를 호출하는 데 사용됩니다.
  2. super() 인스턴스 멤버, 즉 인스턴스 변수 및 인스턴스 메소드와 함께 사용할 수 있습니다.
  3. super() 생성자 내에서 사용하여 부모 클래스의 생성자를 호출 할 수 있습니다.

자, 이제이 지점을 실제로 구현해 봅시다 super().

프로그램 1과 2의 차이점을 확인하십시오. 여기서, 프로그램 2 super()는 Java에서 첫 번째 진술을 증명합니다 .

프로그램 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();
    }
}

산출:

(200)
(200)

이제 프로그램 2를 확인하고 주요 차이점을 찾아보십시오.

프로그램 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();
    }
}

산출:

(100)
(200)

프로그램 1에서 출력은 파생 클래스에만있었습니다. 기본 클래스 나 부모 클래스의 변수를 인쇄 할 수 없습니다. 그러나 2 프로그램에, 우리가 사용한 super()변수 a의 출력을 인쇄하고, 대신에 변수의 값을 인쇄 중에 a유도 된 클래스를, 그 변수의 값을 출력 a기본 클래스를. 따라서 super()직계 부모에게 전화하는 데 사용됩니다.

이제 프로그램 3과 프로그램 4의 차이점을 확인하십시오.

프로그램 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();
    }
}

산출:

200

여기서 출력은 200입니다. 호출 할 때 파생 클래스 Show()Show()함수가 호출되었습니다. 그러나 Show()부모 클래스 의 함수 를 호출하려면 어떻게해야 합니까? 해결책은 프로그램 4를 확인하십시오.

프로그램 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();
    }
}

산출:

(100)
(200)

여기서 우리는 두 개의 출력, 100 및 200을하면 점점 Show()파생 클래스의 함수가 호출, 그것은 먼저 호출 Show()때문에 내부, 부모 클래스의 기능을 Show()파생 클래스의 기능을, 우리는라고 Show()바꾸어 부모 클래스의 기능을 super함수 이름 앞 의 키워드


4
왜 소스 코드 예제를 들여 쓰지 않았습니까? 특별한 이유가 있습니까?
erikbwork

NO erikb, 나는) 슈퍼의 사용을 (알고 싶어하지 이하 만 내가가는.
모한

내 기본 클래스에서 나는 하나, 둘, ... 인수로 생성자를 오버로드합니다.
Mohan

그러나 파생 클래스에서 argu없이 super ()를 사용합니다. 그러면 기본 클래스의 기본 생성자를 자동으로 호출하는지 어떻게되는지
Mohan

2
super()키워드가 아닙니다. 생성자 호출입니다. super키워드이며 # 1 및 # 2는 해당 정의에서만 의미가 있습니다.
Lorne의 후작

37

소스 기사 : Java : super () 호출


예. super(...)수퍼 클래스의 생성자를 호출합니다.

삽화:

여기에 이미지 설명을 입력하십시오


독립형 예 :

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

인쇄물:

Constructing an animal: From Dog constructor
Constructing a dog.

내 기본 클래스에서 파생 클래스의 1, 2, ... 인수로 생성자를 오버로드합니다 .argu없이 super ()를 사용합니다. 그러면 기본 클래스의 기본 생성자를 자동으로 호출하는지 여부는 어떻게
됩니까

예. 당신이 호출하는 경우 super()는 인수가없는 슈퍼 클래스의 생성자를 호출합니다. 마찬가지로, 그렇게하면 1 인수 생성자를 호출합니다 super(arg1).
aioobe

기본 클래스에 인수가없는 생성자가 없으면 파생 클래스가 super ()를 호출하면 어떻게됩니까?
Mohan

1
아무것도. 컴파일되지 않습니다. 생성자를 직접 제공하는 경우 자동 / 기본 / 인수 인수 생성자가 생성 super()되지 않으므로 유효한 호출이 아닙니다.
aioobe

29

부모 생성자를 호출하는 데 super ()가 사용됩니까?

예.

Pls는 Super ()에 대해 설명합니다.

super()super매개 변수없는 부모 생성자를 호출하는 키워드 의 특별한 사용입니다 . 일반적으로 super키워드는 재정의 된 메서드를 호출하거나 숨겨진 필드에 액세스하거나 수퍼 클래스의 생성자를 호출하는 데 사용할 수 있습니다.

공식 튜토리얼 은 다음과 같습니다.


5
super()부모 생성자 super.myMethod()를 호출하는 데 사용되고 재정의 된 메서드를 호출하는 데 사용됩니다.
Sean Patrick Floyd

2
범위 내에서 @seanizer 또는 수퍼 클래스의 다른 메소드 (정적 포함). super는 기본 클래스에 대한 참조 일뿐입니다.
atamanroman

3
super ()가 기본 클래스 메소드를 호출하는 데 사용되지 않는다고 생각합니다. 그래도 super.method ()를 사용할 수 있습니다.
Dheeraj Joshi

@seanizer, @Dheeraj : 귀하의 의견에 감사드립니다. 제 답변을 수정했습니다.
Heinzi

7

인수가없는 수퍼 생성자를 호출하면 화면 공간과 프로그래머 시간이 낭비됩니다. 컴파일러는 작성 여부에 관계없이 정확히 동일한 코드를 생성합니다.

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

class Implicit {
    Implicit() {
    }
}

나는 그것이 몇 수업에서 사용되었다는 것을 알았습니다. 목적이 무엇인지 확실하지 않았습니다. 답변이 도움이됩니다.
iprashant

6

예, super()(소문자)는 부모 클래스의 생성자를 호출합니다. 인수를 포함 할 수 있습니다.super(foo, bar)

super메소드에서 슈퍼 클래스의 메소드를 호출하는 데 사용할 수 있는 키워드 도 있습니다.

에서 "자바 슈퍼"결과에 대한 빠른 구글


4

맞아요. Super는 부모 생성자를 호출하는 데 사용됩니다. 따라서 이와 같은 코드 블록이 있다고 가정하십시오.

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

그런 다음 멤버 변수 n에 값을 할당 할 수 있습니다.


2

나는 모든 답을 보았습니다. 그러나 모두가 한 가지 중요한 점을 언급하는 것을 잊었습니다.

생성자의 첫 번째 줄에서 super ()를 호출하거나 사용해야합니다.


1

그냥 super (); 클래스의 슈퍼 클래스가 존재하는 경우, 단독으로 디폴트 생성자를 호출합니다. 그러나 기본 생성자를 직접 작성해야합니다. 자바가 구현하지 않고 자바를 생성하지 않는다면, super ()를 저장하십시오. 범용 수퍼 클래스 객체를 참조하면 하위 클래스에서 호출 할 수 없습니다.

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

}

인수 없이 .
Lorne의 후작

1

예를 들어, 셀레늄 자동화에는 다음과 같이 부모의 생성자를 사용할 수있는 PageObject가 있습니다.

public class DeveloperSteps extends ScenarioSteps {

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

1

내가 이해 한 코드로 공유하고 싶습니다.

java의 super 키워드는 상위 클래스 객체를 참조하는 데 사용되는 참조 변수입니다. 주로 다음과 같은 상황에서 사용됩니다.

1. 변수와 함께 super 사용 :

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

산출:-

Maximum Speed: 120
  1. 메소드와 함께 super 사용 :
/* 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(); 
    } 
}

산출:-

This is student class
This is person class

생성자와 함께 super 사용 :

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

산출:-

Person class Constructor
Student class Constructor

0

생성자 생성자
에서는 점없이이를 사용하여 다른 생성자를 호출 할 수 있습니다. super슈퍼 클래스에서 생성자를 호출합니다. this이 클래스에서 생성자를 호출합니다.

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수퍼 클래스 자체를 초기화해야하는 경우에 유용합니다. this생성자 중 하나에서 모든 하드 초기화 코드를 한 번만 작성하고 작성하기가 훨씬 쉬운 다른 모든 생성자에서 호출 할 수 있습니다.

메소드
모든 메소드에서 점과 함께 사용하여 다른 메소드를 호출 할 수 있습니다. super.method()수퍼 클래스에서 메소드를 호출합니다. this.method()이 클래스에서 메소드를 호출합니다.

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

super특정 시나리오에서 유용합니다. 클래스에 수퍼 클래스와 동일한 메소드가있는 경우 Java는 클래스에서 메소드를 원한다고 가정합니다. super대신 슈퍼 클래스의 메소드를 요청할 수 있습니다. this코드를 더 읽기 쉽게 만드는 방법으로 만 유용합니다.


0

슈퍼 키워드는 슈퍼 클래스의 생성자를 호출하고 슈퍼 클래스의 멤버를 참조 할 수 있습니다

당신이 호출 할 때 () 슈퍼 올바른 인수와 함께, 우리는 실제로 생성자 전화 박스 변수 초기화, , 높이깊이 해당 매개 변수의 값을 사용하여 함. 부가 가치 가중치를 초기화하기 만하면됩니다. 필요한 경우 클래스 변수 Box를 private으로 클래스화할 수 있습니다 . Box 클래스 전용 수정 자의 필드에 넣고 아무런 문제없이 액세스 할 수 있는지 확인하십시오.

수퍼 클래스에는 여러 오버로드 된 버전 생성자가있을 수 있으므로 다른 매개 변수를 사용하여 super () 메소드를 호출 할 수 있습니다 . 프로그램은 지정된 인수와 일치하는 생성자를 수행합니다.

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 는 키워드입니다. 서브 클래스 메소드 정의 내에서 사용되어 수퍼 클래스에 정의 된 메소드를 호출합니다. 수퍼 클래스의 개인 메소드는 호출 할 수 없습니다. super 키워드는 public 및 protected 메소드 만 호출 할 수 있습니다. 또한 클래스 생성자가 상위 클래스의 생성자를 호출하는 데 사용됩니다.

자세한 설명은 여기 를 확인 하십시오 .


0

언급했듯이 기본 생성자 안에 첫 번째 줄암시 적 super () 가 있습니다. .

이 super () 는 클래스 계층의 최상위에서 시작 하여 일련의 생성자를 자동으로 호출하고 계층 아래로 이동합니다.

이 있다면 두 개 이상의 클래스 프로그램의 클래스 계층 구조에서 상위 클래스의 기본 생성자는 얻을 것 이라고 첫째 .

다음은 이에 대한 예입니다.

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

위의 결과는 다음과 같습니다.

Constructor A
Constructor B
Constructor C
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.