2013-08-21 1 views
4

constooctor가있는 POJO 클래스 사용자가 한 명 있다고 가정합니다. public User(int id, String name){...}. 그러나 매개 변수없이 User u=new User()과 같은 User 객체를 인스턴스화하면 과 같은 오류가 발생합니다. 생성자 User()는 정의되지 않았습니다.. 하지만 매개 변수화 된 생성자가 없을 때 제대로 작동합니다. 누군가 기본 생성자를 정의해야하는 이유를 설명해 주시겠습니까?기본 생성자가 Object를 인스턴스화하는 동안 Parameterized 생성자가있는 POJO 파일에서 선언해야하는 이유는 무엇입니까?

답변

4

기본 제공 (매개 변수 없음) 생성자는 다른 사람을 제공하지 않은 경우에만 제공됩니다. 클래스에 대해 단일 생성자를 정의하는 경우 명시 적으로 정의 된 (즉 코드에서) 생성자 중 하나를 사용하여 객체를 인스턴스화해야합니다. 물론 당신이하려고하는 것을 위해 작동한다면, 당신 자신의 zero-parameter 빈 생성자를 정의 할 수 있습니다.

편집 : why?

컴파일러는 정의 된 생성자가없는 경우 개체가 인스턴스화 될 수 있도록 기본 생성자를 제공한다 대답. 그러나 매개 변수 생성자를 정의한 경우, 해당 클래스의 새 인스턴스를 만들 때 변수가 전달한 매개 변수로 초기화되어야합니다 (또는 유사한 작업을 수행해야 함). 이러한 초기화가 없으면 개체가 예상대로 작동하지 않을 수 있습니다. 따라서 컴파일러는 기본 생성자를 정의하지 않아서 발생하는 것을 방지합니다 (사용자가 정의한 경우).

+0

예 사실 그 사실을 알고 있습니다. 그런데 왜? JVM이 매번 기본 생성자를 제공하지 않는 이유는 무엇입니까? –

+0

"왜"에 대한 좋은 대답이 없습니다. 그것이 언어가 구축 된 방법이기 때문입니다. 아마도 명시 적으로 정의되지 않은 생성자를 호출 할 때 혼란을 피할 수 있습니다. 기본 생성자를 제공하는 Java는 사용자의 편의를 위해 100 % 의례가됩니다. – Kon

+7

@VimalBera : 기본 생성자를 제공하는 JVM이 아닙니다. Java 컴파일러입니다. –

0

Java 컴파일러는 생성자없는 모든 클래스에 대해 매개 변수없는 기본 생성자를 자동으로 제공합니다. 클래스에 생성자가 정의되어 있지 않으면 Java 컴파일러는 생성 된 클래스 파일에 매개 변수없는 생성자를 추가합니다. 그러나 클래스에 매개 변수가있는 생성자가있는 경우 매개 변수없는 생성자를 작성해야하며 컴파일러는이를 추가하지 않습니다.

+6

당신은 생성자를 추가하는 JVM에 대해 계속 이야기합니다. 컴파일러는 않습니다. (그리고 * arguments *가 아닌 * parameters *가없는 생성자입니다. * 생성자 또는 메서드를 호출 할 때 * 인수가 제공됩니다.) –

+0

@JonSkeet 네가 커밋하는 동안 그것을 고치고있다 .--) 감사합니다! –

+1

하지만 인수 부분이 아닌가요? (솔직히 말해서,이 답변이 실제로 Kon의 것 이상을 추가하는지 확신 할 수 없습니다.) –

0

컴파일러는 생성자가없는 클래스에 대해 자동으로 인수가없는 기본 생성자를 제공하지만 명시 적으로 인수가있는 생성자를 제공하면 컴파일러는 보안상의 이유로 주로 기본 생성자를 제공하지 않습니다. 생성자는 개발자가 제공되지 않는 경우

그래서 당신이 할 수있는

public User(int id, String name){...} 
public User(){this(defualtID,defaultName)}; 
2

인수 없음의 생성자가 자동으로 컴파일러에 의해 추가 될 것입니다. 그러나 사용자 지정 매개 변수화 된 생성자를 직접두면 컴파일러에서 기본 생성자를 추가하지 않습니다. 당신은 여전히 ​​당신의 인수 없음의 생성자를 사용하려는 경우이 시나리오에서는

는, 당신은 명시 적으로 직접 제공해야합니다 :

public User() { 
} 

public User(int id, String name) { 
} 

이 뒤에 논리가있다 : 당신이 당신의 자신의 매개 변수화 생성자를 정의하는 경우, 생성자에 나열된 매개 변수가 클래스의 객체를 생성하는 데 필요하다고 선언하고 있습니다. 따라서 라이브러리의 사용자가이 두 매개 변수를 제공하지 않으면 개체가 구성 할 수 없어야 함을 암시 적으로 선언합니다. 따라서 컴파일러는 인자가없는 생성자를 추가하지 않습니다.

매개 변수화 된 생성자에서 지정된 매개 변수가 제공되지 않고 사용자 (인수 없음)가없는 경우에도 클래스가 계속 작동 할 수 있음을 선언하려면 명시 적으로 인수가 아닌 생성자를 제공하여 명시 적으로 선언하십시오 .

1

나는 이렇게 늦게 대답을 제공하지만, 이제 내가 알고있는 당신과 함께 공유 해보자 오전 : 당신이 생성자 컴파일러를 제공하지 않는

  1. 이 생성자를 제공합니다. 왜 ? 왜냐하면 여러분은 인자 생성자없이 객체를 초기화 할 것이기 때문입니다. 그래서 컴파일러는 당신을 위해 그것을합니다.
  2. 매개 변수화 된 생성자를 제공하면 컴파일러는 개체를 초기화하는 데 사용할 생성자를 알 수 없습니다. 따라서 컴파일러는 인자없는 생성자를 제공하지 않습니다. 따라서 명시 적으로 작성해야합니다.

    희망이 있으면 도움이 될 것입니다.

+0

가지고있는 것을 공유해 주셔서 감사합니다. :) –

관련 문제