2013-04-16 1 views
6

클래스에 매개 변수화 된 생성자가있는 경우 Java가 기본 생성자를 제공하지 않는 이유는 무엇입니까? 다음은 다음의 예클래스에 매개 변수화 된 생성자가있는 경우 Java가 기본 생성자를 제공하지 않는 이유는 무엇입니까?

class A { 
    int a; 

    public A() { 
    } 

    public A(int val) { 
     a = val; 
    } 
} 

을 고려 I 명시 적으로 기본 생성자를 추가해야합니다. Java가 매개 변수화 된 생성자를 갖는 클래스에 기본 생성자를 제공하지 않는 이유는 무엇입니까?

+0

나는 이것이 중복이라고 생각하지 않는다. 그것은 * 왜 사양에 그것이 무엇을 하는지를 묻는 것입니다. – OrangeDog

+0

@OrangeDog 여기의 어려움은 OP 질문에 대한 문자 적 ​​대답이 ""기본 생성자의 정의가 '컴파일러가 정의하지 않을 때 정의하는 컴파일러이므로 생성자를 명시 적으로 정의 할 때 컴파일러는 기본 생성자를 생성하지 않습니다. 다른 것'"*. (그들의'public A() {}'는 기본 생성자가 아닙니다.) OP는 아마도 인자없는 생성자에 대해 실제로 묻는 용어와 아마도 * 아마 *를 혼합하고있을 것입니다. OP가 용어를 섞어 놓고 있다고 가정한다면 질문을 편집해야 할 것입니다. – Radiodef

답변

2

클래스에서 아무 것도 정의하지 않으면 Java가 기본 생성자를 제공합니다.

생성자가 정의되어 있으면 (인수가없는 경우에도) 컴파일러에서 다른 것을 제공하지 않습니다.

이 방식으로 지정 되었기 때문에 다음과 같이 작동합니다. 자세한 내용은 Language Specification

+4

OP는 클래스가 매개 변수화 된 생성자를 가지고 있다면'Java가 기본 생성자를 제공하지 않는다 '는 것을 알고 있습니다. 질문은 "왜"입니까? – Pshemo

9

보안 및 인터페이스의 조합과 관련이 있습니다. 컴파일러는 명시 적으로 정의하지 않은 메소드를 제공하면 안됩니다. 단 하나의 예외는 생성자를 지정하지 않은 경우 편의가있는 인수가없는 생성자입니다. 생성자를 지정하면 컴파일러는 다른 것을 원하지 않는다고 가정합니다.

5

컴파일러가 모든 클래스에 arg 생성자를 자동으로 제공하지 않으면 클래스 디자인이 손상 될 수 있습니다. Scanner 클래스를 고려하십시오. 여기에는 데이터를 읽을 위치에서 지정할 수있는 생성자가 거의 없습니다. 컴파일러가 인수 생성자를 추가하지 않으면이 생성자로 초기화 된 객체에서 데이터를 읽는 스캐너 메서드 중 하나를 호출 한 후 데이터 소스가 지정되지 않으므로 예외가 발생합니다.

2

기본 생성자를 갖는 것이 바람직하지 않은 경우가 있습니다. 언어는 컴파일러가 생성하지 못하도록하는 방법을 제공해야합니다. 명시 적 생성자가 아닌 다른 표시기를 사용하면 기본값이 비활성화 될 때마다 생성자를 지정해야하는 등의 문제가 발생할 수 있습니다.

현재 배열은 기본값이 비활성화 될 때마다 다른 생성자가 있음을 확인함으로써이 문제를 제거합니다.

관련 문제