누군가 내가 오해 한 것을 지적 할 수 있습니까?Java : 추상 클래스 생성자 및 this()
다음과 같이 나는 두 개의 클래스, 요약서와 콘크리트있어:
public abstract class Abstract
{
protected static int ORDER = 1;
public static void main (String[] args)
{
Concrete c = new Concrete("Hello");
}
public Abstract()
{
Class c = this.getClass();
System.out.println(ORDER++ + ": Class = "
+ c.getSimpleName()
+ "; Abstract's no-arg constructor called.");
}
public Abstract(String arg)
{
this();
Class c = this.getClass();
System.out.println(ORDER++ + ": Class = "
+ c.getSimpleName()
+ "; Abstract's 1-arg constructor called.");
}
}
및
public class Concrete extends Abstract
{
public Concrete()
{
super();
Class c = this.getClass();
System.out.println(ORDER++ + ": Class = "
+ c.getSimpleName()
+ "; Concrete's no-arg constructor called.");
}
public Concrete(String arg)
{
super(arg);
Class c = this.getClass();
System.out.println(ORDER++ + ": Class = "
+ c.getSimpleName()
+ "; Concrete's 1-arg constructor called.");
}
}
나는 다음과 같은 출력을 얻을이 실행하면 :
을1) 클래스 = 콘크리트; Abstract의 no-arg 생성자가 호출되었습니다.
2) 클래스 = 콘크리트; Abstract의 1-arg 생성자 이 호출되었습니다.
3) Class = Concrete; 콘크리트의 1 인수 생성자가 호출되었습니다.
내 질문
은 이것이다 : 왜하지 않습니다 추상의 문자열 인수 생성자 호출에서이()에 대한 호출 콘크리트에이 인수 없음의 생성자? 아니면 좀 더 적절하게, Abstract String Arg 생성자에게 Constructor의 "적절한"연결을 허용하는 Concrete의 인수가없는 생성자를 호출 할 수있는 방법이 있습니까?
감사합니다. getClass가 Object isa Concrete를 알고 있지만 this()가 추상 no-arg 생성자를 호출한다는 사실은 나에게 조금 부자연 스럽습니다. 달성하려는 체인은 나에게 생성자간에보다 자연스러운 책임 분담을 허용 한 것으로 보입니다. Concrete의 생성자에서 코드를 복제하거나 새로운 메소드로 옮겨야한다고 생각합니다. 그러나이 추상 클래스의 모든 Concrete 구현을 작성하지는 않았으므로 다른 개발자를 위해 문서화해야 할 내용입니다. . –
그래서 가상 생성자 인 것처럼 생성자를 처리하려고 했습니까? 그래, 그게 효과가 없을거야. –