constooctor가있는 POJO 클래스 사용자가 한 명 있다고 가정합니다. public User(int id, String name){...}
. 그러나 매개 변수없이 User u=new User()
과 같은 User 객체를 인스턴스화하면 과 같은 오류가 발생합니다. 생성자 User()는 정의되지 않았습니다.. 하지만 매개 변수화 된 생성자가 없을 때 제대로 작동합니다. 누군가 기본 생성자를 정의해야하는 이유를 설명해 주시겠습니까?기본 생성자가 Object를 인스턴스화하는 동안 Parameterized 생성자가있는 POJO 파일에서 선언해야하는 이유는 무엇입니까?
답변
기본 제공 (매개 변수 없음) 생성자는 다른 사람을 제공하지 않은 경우에만 제공됩니다. 클래스에 대해 단일 생성자를 정의하는 경우 명시 적으로 정의 된 (즉 코드에서) 생성자 중 하나를 사용하여 객체를 인스턴스화해야합니다. 물론 당신이하려고하는 것을 위해 작동한다면, 당신 자신의 zero-parameter 빈 생성자를 정의 할 수 있습니다.
편집 : why?
컴파일러는 정의 된 생성자가없는 경우 개체가 인스턴스화 될 수 있도록 기본 생성자를 제공한다 대답. 그러나 매개 변수 생성자를 정의한 경우, 해당 클래스의 새 인스턴스를 만들 때 변수가 전달한 매개 변수로 초기화되어야합니다 (또는 유사한 작업을 수행해야 함). 이러한 초기화가 없으면 개체가 예상대로 작동하지 않을 수 있습니다. 따라서 컴파일러는 기본 생성자를 정의하지 않아서 발생하는 것을 방지합니다 (사용자가 정의한 경우).
Java 컴파일러는 생성자없는 모든 클래스에 대해 매개 변수없는 기본 생성자를 자동으로 제공합니다. 클래스에 생성자가 정의되어 있지 않으면 Java 컴파일러는 생성 된 클래스 파일에 매개 변수없는 생성자를 추가합니다. 그러나 클래스에 매개 변수가있는 생성자가있는 경우 매개 변수없는 생성자를 작성해야하며 컴파일러는이를 추가하지 않습니다.
당신은 생성자를 추가하는 JVM에 대해 계속 이야기합니다. 컴파일러는 않습니다. (그리고 * arguments *가 아닌 * parameters *가없는 생성자입니다. * 생성자 또는 메서드를 호출 할 때 * 인수가 제공됩니다.) –
@JonSkeet 네가 커밋하는 동안 그것을 고치고있다 .--) 감사합니다! –
하지만 인수 부분이 아닌가요? (솔직히 말해서,이 답변이 실제로 Kon의 것 이상을 추가하는지 확신 할 수 없습니다.) –
컴파일러는 생성자가없는 클래스에 대해 자동으로 인수가없는 기본 생성자를 제공하지만 명시 적으로 인수가있는 생성자를 제공하면 컴파일러는 보안상의 이유로 주로 기본 생성자를 제공하지 않습니다. 생성자는 개발자가 제공되지 않는 경우
그래서 당신이 할 수있는
public User(int id, String name){...}
public User(){this(defualtID,defaultName)};
인수 없음의 생성자가 자동으로 컴파일러에 의해 추가 될 것입니다. 그러나 사용자 지정 매개 변수화 된 생성자를 직접두면 컴파일러에서 기본 생성자를 추가하지 않습니다. 당신은 여전히 당신의 인수 없음의 생성자를 사용하려는 경우이 시나리오에서는
는, 당신은 명시 적으로 직접 제공해야합니다 :
public User() {
}
public User(int id, String name) {
}
이 뒤에 논리가있다 : 당신이 당신의 자신의 매개 변수화 생성자를 정의하는 경우, 생성자에 나열된 매개 변수가 클래스의 객체를 생성하는 데 필요하다고 선언하고 있습니다. 따라서 라이브러리의 사용자가이 두 매개 변수를 제공하지 않으면 개체가 구성 할 수 없어야 함을 암시 적으로 선언합니다. 따라서 컴파일러는 인자가없는 생성자를 추가하지 않습니다.
매개 변수화 된 생성자에서 지정된 매개 변수가 제공되지 않고 사용자 (인수 없음)가없는 경우에도 클래스가 계속 작동 할 수 있음을 선언하려면 명시 적으로 인수가 아닌 생성자를 제공하여 명시 적으로 선언하십시오 .
나는 이렇게 늦게 대답을 제공하지만, 이제 내가 알고있는 당신과 함께 공유 해보자 오전 : 당신이 생성자 컴파일러를 제공하지 않는
- 이 생성자를 제공합니다. 왜 ? 왜냐하면 여러분은 인자 생성자없이 객체를 초기화 할 것이기 때문입니다. 그래서 컴파일러는 당신을 위해 그것을합니다.
매개 변수화 된 생성자를 제공하면 컴파일러는 개체를 초기화하는 데 사용할 생성자를 알 수 없습니다. 따라서 컴파일러는 인자없는 생성자를 제공하지 않습니다. 따라서 명시 적으로 작성해야합니다.
희망이 있으면 도움이 될 것입니다.
가지고있는 것을 공유해 주셔서 감사합니다. :) –
- 1. 정적 파일을 소스 파일에서 선언해야하는 이유는 무엇입니까?
- 2. 이 방법을 .h 파일에서 선언해야하는 이유는 무엇입니까?
- 3. std :: function 인스턴스에 기본 생성자가있는 이유는 무엇입니까?
- 4. 개인 생성자가있는 동안 기본 생성자를 호출 할 수없는 이유는 무엇입니까?
- 5. 기본 생성자가 호출되는 이유는 무엇입니까?
- 6. 인터페이스를 다시 선언해야하는 이유는 무엇입니까?
- 7. "적절한 기본 생성자가 없습니다."- 기본 생성자가 호출되는 이유는 무엇입니까?
- 8. 개인 생성자가있는 클래스를 인스턴스화하는 방법
- 9. 생성자가있는 기본 컨트롤러 상속
- 10. IBAction - 헤더 파일에서 선언해야하는 이유
- 11. viewDidLoad, viewDidUnload 등의 메소드를 선언해야하는 이유는 무엇입니까?
- 12. 기본 생성자가 bool을 반환하는 이유는 무엇입니까?
- 13. 기본 생성자가 가상 상속에서 호출되는 이유는 무엇입니까?
- 14. java.lang.reflect.Modifier에 public 생성자가있는 이유는 무엇입니까?
- 15. String 클래스에 복사 생성자가있는 이유는 무엇입니까?
- 16. `constructor`이 Object를 가리키는 이유는 무엇입니까?
- 17. log4net이 object를 사용하는 이유는 무엇입니까?
- 18. jQuery Flip, 변수를 선언해야하는 이유는 무엇입니까?
- 19. constants.rb의이 변수를 전역 변수로 선언해야하는 이유는 무엇입니까?
- 20. 내 전역 변수를 포인터로 선언해야하는 이유는 무엇입니까?
- 21. 하위 사전에서 PoolDictionaries를 다시 선언해야하는 이유는 무엇입니까?
- 22. 이 애플릿에서 클래스를 공개로 선언해야하는 이유는 무엇입니까?
- 23. HttpServlet 클래스를 추상으로 선언해야하는 이유는 무엇입니까?
- 24. 파이썬에서 해시하기 전에 인코딩을 선언해야하는 이유는 무엇입니까?
- 25. 정적 및 외장으로 메서드를 선언해야하는 이유는 무엇입니까?
- 26. 최상위 수준에서 열거 형을 선언해야하는 이유는 무엇입니까?
- 27. 클래스 내부에 인터페이스를 선언해야하는 이유는 무엇입니까?
- 28. 클래스를 인스턴스화하는 방법 EJB 또는 POJO?
- 29. 서블릿에는 기본 생성자가 없습니다.
- 30. 생성자가 변경된 이유는 무엇입니까?
예 사실 그 사실을 알고 있습니다. 그런데 왜? JVM이 매번 기본 생성자를 제공하지 않는 이유는 무엇입니까? –
"왜"에 대한 좋은 대답이 없습니다. 그것이 언어가 구축 된 방법이기 때문입니다. 아마도 명시 적으로 정의되지 않은 생성자를 호출 할 때 혼란을 피할 수 있습니다. 기본 생성자를 제공하는 Java는 사용자의 편의를 위해 100 % 의례가됩니다. – Kon
@VimalBera : 기본 생성자를 제공하는 JVM이 아닙니다. Java 컴파일러입니다. –