source

생성자에 super()를 넣을 필요가 없습니까?

goodcode 2022. 8. 25. 23:49
반응형

생성자에 super()를 넣을 필요가 없습니까?

서브클래스의 컨스트럭터에 넣지 않으면 컴파일러에 의해 자동으로 입력되지 않습니까?

그럼 신경도 안 써도 되는 거야?몇몇 기사에서 그들은 그것을 공표했다.

인수가 있는 컨스트럭터가 1개 있는 경우, 이것이 컨스트럭터일까요, 아니면 인수 리스트가 없는 컨스트럭터가 필요합니까?

먼저 몇 가지 용어:

  • No-args 생성자: 매개 변수가 없는 생성자;
  • 액세스 가능한 no-args 생성자: 하위 클래스에서 볼 수 있는 슈퍼 클래스의 no-args 생성자.즉, 퍼블릭 또는 프로텍트 중 하나이며, 양쪽 클래스가 같은 패키지에 포함되어 있는 경우에는 패키지 액세스입니다.
  • 기본 생성자: 클래스에 명시적 생성자가 없을 때 컴파일러에 의해 추가된 공용 no-args 생성자.

따라서 모든 클래스에는 적어도1개의 생성자가 있습니다.

서브클래스 컨스트럭터는 서브클래스의 컨스트럭터에서 코드를 실행하기 전에 슈퍼클래스에서 어떤 컨스트럭터를 호출할지를 첫 번째로 지정할 수 있습니다.

서브클래스 컨스트럭터가 호출할 슈퍼클래스 컨스트럭터를 지정하지 않으면 컴파일러는 자동으로 슈퍼클래스 내의 접근 가능한 no-args 컨스트럭터를 호출합니다.

슈퍼 클래스에 arg 생성자가 없거나 액세스할 수 없는 경우, (서브 클래스 생성자에서) 호출할 슈퍼 클래스 생성자를 지정하지 않는 것은 컴파일러 오류이므로 지정해야 합니다.

예를 들어 다음과 같습니다.

public class Base { }
public class Derived extends Base { }

명시적으로 컨스트럭터를 추가하지 않으면 Java가 사용자 대신 퍼블릭 디폴트 컨스트럭터를 배치하기 때문에 괜찮습니다.

public class Base { }
public class Derived extends Base { public Derived(int i) { } }

그것도 괜찮네요.

public class Base { public Base(String s) { } }
public class Derived extends Base { }

Base에 기본 생성자가 없기 때문에 위의 내용은 컴파일 오류입니다.

public class Base { private Base() { } }
public class Derived extends Base { }

Base의 no-args 생성자는 비공개이므로 이 또한 오류입니다.

슈퍼 클래스 생성자에 인수가 없는 경우 Java는 자동으로 해당 인수를 호출합니다.인수가 있으면 오류가 발생합니다.

src: http://java.sun.com/docs/books/tutorial/java/IandI/super.html

이론이 없는 슈퍼 컨스트럭터를 호출하는 것은 화면 공간과 프로그래머의 시간을 낭비하는 것에 불과합니다.컴파일러는 작성 여부에 관계없이 동일한 코드를 생성합니다.

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

class Implicit {
    Implicit() {
    }
}

갱신(2018년 12월):

기입을 super() IDE 의 이 됩니다.

2018년 12월 현재 Eclipse 및 IntelliJ는 파생 클래스의 생성자에서 기본 클래스의 생성자로 편안하게 이동할 수 있는 수단을 제공하지 않습니다.

기본 부모 생성자는 호출하지 않더라도 하위 기본 생성자에서 호출됩니다.

주된

public class Main {

    public static void main(String[] args) {
        A a = new B();
    }
}

A

public class A {

    public A() {
        System.out.println("A");
    }
}

B

public class B extends A {

    public B() {
        System.out.println("B");
    }
}

인쇄물

A
B

명시적으로 super([arguments])라고 불리지 않는 경우 클래스 생성자는 항상 super()를 호출합니다.프로그래밍 중에 슈퍼 클래스 생성자의 접근을 염두에 둡니다.특정 클래스를 확장하지 않을 경우 java.disclass가 자동으로 확장됩니다.오브젝트 클래스

abstract class Book
 {
String title;
String author;
Book(String t,String a){
    title=t;
    author=a;
}
abstract void display();

}    

슈퍼 클래스에 No-args 컨스트럭터를 사용할 수 있는 경우.no argument constructor를 사용하는 것이 좋습니다.그렇지 않으면 파라미터와 함께 슈퍼 컨스트럭터를 전달해야 합니다.

슈퍼 클래스에 arg 생성자가 없거나 액세스할 수 없는 경우, (서브 클래스 생성자에서) 호출할 슈퍼 클래스 생성자를 지정하지 않는 것은 컴파일러 오류이므로 지정해야 합니다.

class MyBook extends Book{   
int price ;
public  MyBook(String t,String a,int price){
     super(t,a);
    this.price=price;
}

public void display(){
    System.out.println("Title: "+title);
 System.out.println("Author: "+author); 
System.out.println("Price: "+price);

}

}

언급URL : https://stackoverflow.com/questions/2054022/is-it-unnecessary-to-put-super-in-constructor

반응형