생성자에 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
'source' 카테고리의 다른 글
부모 퇴출 후 자녀 프로세스를 정지시키는 방법 (0) | 2022.08.25 |
---|---|
js 파일 VUEX에서 상태 액세스 방법 (0) | 2022.08.25 |
검출되지 않은 오류: [vuex] getters는 함수여야 하지만 "getters.default"는 {}입니다. (0) | 2022.08.25 |
Bootstrap-Vue 텍스트 필드를 mm/dd/yyy 형식으로 변경하는 적절한 방법 (0) | 2022.08.25 |
Vuejs에서 동적 요소와 함께 v-show를 사용하는 방법 (0) | 2022.08.25 |