Programing

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

crosscheck 2020. 6. 8. 20:47
반응형

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


서브 클래스의 생성자에 넣지 않으면 컴파일러가 자동으로 넣지 않습니까?

그것은 내가 그것에 대해 신경 쓸 필요가 없다는 것을 의미합니까? 일부 기사에서 그들은 그것을 내놓았습니다.

그리고 인수가있는 생성자가 하나 있으면 이것이 생성자입니까, 아니면 인수 목록이없는 생성자를 사용합니까?


먼저 몇 가지 용어 :

  • 인수 없음 생성자 : 매개 변수가없는 생성자;
  • 접근 가능한 no-args 생성자 : 서브 클래스에 보이는 수퍼 클래스의 no-args 생성자. 즉, 공개 또는 보호 중이거나 두 클래스가 모두 동일한 패키지에 있으면 패키지 액세스를 의미합니다.
  • 기본 생성자 : 클래스에 명시 적 생성자가없는 경우 컴파일러가 추가 한 공용 인수 없음 생성자.

따라서 모든 클래스에는 생성자가 하나 이상 있습니다.

서브 클래스 생성자 서브 클래스의 생성자에서 코드를 실행하기 전에 호출 할 수퍼 클래스의 생성자 가장 먼저하는 일을 지정할 수 있습니다 .

서브 클래스 생성자가 호출 할 수퍼 클래스 생성자를 지정하지 않으면 컴파일러는 수퍼 클래스에서 액세스 가능한 인수 없음 생성자를 자동으로 호출합니다.

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

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

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 생성자가 private이기 때문에 이것은 또한 오류입니다.


수퍼 클래스 생성자가 인수가 없으면 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();
    }
}

public class A {

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

public class B extends A {

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

인쇄물

A
B

super ([arguments])라고 명시 적으로 지정되지 않은 경우 모든 클래스 생성자는 항상 "super ()"를 호출합니다. 프로그래밍하는 동안 슈퍼 클래스 생성자의 액세스 만 염두에 두어야합니다. 특정 클래스를 확장하지 않으면 자동으로 java.lang이 확장됩니다. . 객체 클래스


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

}    

수퍼 클래스에 No-args 생성자가있을 수 있으면 인수 생성자가없는 것이 좋습니다.

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

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

반응형