super ()는 언제 사용합니까?


82

현재 Java 과정에서 클래스 상속에 대해 배우고 있는데 언제 super()호출 을 사용해야할지 모르겠 습니까?

편집 : 사용되는
코드 예제를 찾았습니다 .super.variable

class A
{
    int k = 10;
}

class Test extends A
{
    public void m() {
        System.out.println(super.k);
    }
}

그래서 여기 에서 수퍼 클래스 superk변수에 액세스 하려면을 사용해야한다는 것을 이해합니다 . 그러나 다른 경우에는 무엇을 super();합니까? 그 자체로?


31
실제로이 예에서는를 super참조 할 필요가 없습니다 k. k직접 참조 할 수 있습니다. super전용 액세스에 필요한 것입니다 A.k명명 된 또 다른 필드 선언 된 경우 k에을 Test( Test.k).
Mark Peters

답변:


143

정확히 전화 하는super() 것은 항상 중복됩니다. 그렇지 않으면 암시 적으로 수행되는 작업을 명시 적으로 수행합니다. 슈퍼 생성자에 대한 호출을 생략하면 인수가없는 슈퍼 생성자가 어쨌든 자동으로 호출되기 때문입니다. 나쁜 스타일이라고 말하는 것은 아닙니다. 어떤 사람들은 노골적인 것을 좋아합니다.

그러나 이것이 유용한 곳은 수퍼 생성자가 서브 클래스에서 전달하려는 인수를 취할 때입니다.

public class Animal {
   private final String noise;
   protected Animal(String noise) {
      this.noise = noise;
   }

   public void makeNoise() {
      System.out.println(noise);
   }
}

public class Pig extends Animal {
    public Pig() {
       super("Oink");
    }
}

2
메서드가 자식 클래스에서 재정의 된 다음 해당 자식 클래스에서 다시 재정의되었다고 가정합니다. (다단계 상속) 조부모와 부모의 메서드를 동시에 grandchildren 클래스로 호출해야한다면 어떨까요? 슈퍼는 어떻게 사용됩니까?
h8pathak

2
@ h8pathak : 자식 클래스가 부모의 구현을 우회 할 수 있지만 조부모를 호출하는 방법을 묻는다면 Java에서는 불가능합니다.
Mark Peters


23

super하위 클래스에서이를 재정의 한 경우 상위 클래스에서 메서드를 호출하려는 경우 하위 클래스에서 키워드를 사용할 수도 있습니다 .

예:

public class CellPhone {
    public void print() {
        System.out.println("I'm a cellphone");
    }
}

public class TouchPhone extends CellPhone {
    @Override
    public void print() {
        super.print();
        System.out.println("I'm a touch screen cellphone");
    }
    public static void main (strings[] args) {
        TouchPhone p = new TouchPhone();
        p.print();
    }
}

여기에서 라인 super.print()print()수퍼 클래스 의 메소드를 호출합니다 CellPhone. 출력은 다음과 같습니다.

I'm a cellphone
I'm a touch screen cellphone

1
기본 메서드 선언 줄에 (String [] args) 있었습니까? 감사합니다!
애팔 래 치아 수학

9

슈퍼 클래스 생성자가 호출되기를 원할 때-그 안의 필드를 초기화합니다. 언제 사용하는지 이해하려면이 문서를 참조하십시오.

http://download.oracle.com/javase/tutorial/java/IandI/super.html


4
이 링크에서 말했듯이, 당신은 결코 없다 호출하는 super()자바 암시를 추가 할 것 같은. 그러나 super(args)기본이 아닌 부모 생성자가 필요한 경우 호출 해야합니다.
Michael Brewer-Davis

9

부모 클래스의 생성자를 호출하기 위해 하위 클래스 생성자의 첫 번째 줄로 사용합니다.

예를 들면 :

public class TheSuper{
    public TheSuper(){
        eatCake();
    }
}

public class TheSub extends TheSuper{
    public TheSub(){
        super();
        eatMoreCake();
    }
}

의 인스턴스를 생성 TheSub하면 eatCake()eatMoreCake()


1

이를 사용하여 슈퍼 클래스의 메서드를 호출 할 수 있습니다 (예 : 이러한 메서드를 재정의 할 때 super.foo () 등). 이렇게하면 해당 기능을 유지하고 재정의에있는 다른 모든 항목에 추가 할 수 있습니다. 방법.



1

super()특별히 슈퍼 클래스의 생성자를 실행하기 위해 호출 합니다. 클래스에 여러 생성자가있을 수 있으므로 특정 생성자를 사용 super()하거나 super(param,param)Java가이를 처리하고 표준 생성자를 호출하도록 할 수 있습니다. 클래스 계층 구조를 따르는 클래스는 "is-a"관계를 따릅니다.


0

서브 클래스 생성자의 첫 번째 줄은 super()수퍼 클래스의 생성자가 호출되도록 하기위한 호출이어야합니다 .


사실이 아니다. 자동으로 발생합니다.
Mark Peters

기본 생성자가 없더라도? 무엇을 통과해야하는지 어떻게 알 수 있습니까?
robev 2011

기본 생성자가 super(some args)없으면 super(). 하지만 요점은 "반드시"가 틀렸다는 것입니다. 슈퍼 클래스의 생성자 중 하나는 클래스가 컴파일되는 동안 호출되도록 보장 됩니다.
Mark Peters

나는 super ()를 작성할 때 매개 변수가없는 생성자를 의미하는 것이 아니라, 어떤 것도 작성하고 싶지 않다는 것을 분명히 밝히지 않았습니다. 그리고 예, 당신이 그것을 호출해야 함을 의미했습니다. 그렇지 않으면 컴파일되지 않을 것입니다.
robev 2011

1
다시 한 번, 부모 클래스에 인수가없는 생성자가있는 경우 슈퍼 생성자에 대한 명시 적 호출이 필요하지 않습니다. 슈퍼 생성자는 항상 호출되는 반면, 구문은 슈퍼 생성자가 호출되지 않으면 호출되지 않을 위험에있는 것처럼 들립니다 super(...). 그 위험은 전혀 없습니다. 컴파일되지 않을 위험이 있습니다.
Mark Peters

0

방금 시도해 보았습니다. super (); @Mark Peters가 말한 것처럼 주석없이 동일한 작업을 수행합니다.

package javaapplication6;

/**
 *
 * @author sborusu
 */
public class Super_Test {
    Super_Test(){
        System.out.println("This is super class, no object is created");
    }
}
class Super_sub extends Super_Test{
    Super_sub(){
       super();
       System.out.println("This is sub class, object is created");
    }
    public static void main(String args[]){
        new Super_sub();
    }
}

0

오라클 문서 페이지에서 :

메서드가 수퍼 클래스의 메서드 중 하나를 재정의하는 경우 키워드를 사용하여 재정의 된 메서드를 호출 할 수 있습니다 super.

를 사용 super하여 숨겨진 필드를 참조 할 수도 있습니다 (필드를 숨기는 것은 권장되지 않음).

super하위 클래스의 생성자에서 사용 :

수퍼 클래스 생성자의 호출은 서브 클래스 생성자의 첫 번째 행이어야합니다.

슈퍼 클래스 생성자를 호출하는 구문은 다음과 같습니다.

super();  

또는:

super(parameter list);

를 사용하면 super()인수없는 슈퍼 클래스 생성자가 호출됩니다. 를 사용하면 super(parameter list)일치하는 매개 변수 목록이있는 슈퍼 클래스 생성자가 호출됩니다.

참고 : 생성자가 명시 적으로 수퍼 클래스 생성자를 호출하지 않는 경우 Java 컴파일러는 수퍼 클래스의 인수가없는 생성자에 대한 호출을 자동으로 삽입합니다 . 슈퍼 클래스에 인수가없는 생성자가 없으면 컴파일 타임 오류가 발생합니다.

관련 게시물 :

다형성 vs 오버로딩 vs 오버로딩

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