2011-02-10 3 views
7

추상 클래스의 개념을 이해하는 데 문제가 있습니다. 내가 읽고있는 정의는 적어도 하나의 선언 된 메소드가 있지만 구현이 부족하여 클래스를 인스턴스화 할 수 없다는 것입니다. Java 달력 클래스는 추상 클래스이며 New 연산자를 사용하여 인스턴스화 할 수는 없지만 달력 객체를 반환하는 getInstance()라는 메서드가 있습니다. 이게 어떻게 작동합니까?추상 클래스를 이해하는 데 도움이됩니다. 자바 캘린더 메서드 getInstance()

Calendar cal = new Calendar(); //doesn't work 
Calendar cal = Calendar.getInstance(); //works 
+1

Jon의 답변은 훌륭하지만 여기에 빠른 추가가 있습니다. 추상적 인 클래스는 결코 인스턴스화 될 수 없습니다. 그들은 추상적 인 메소드를 포함 할 필요가 없으며 실제로 실제로 코드를 가지고있는 많은 메소드를 포함 할 수 있습니다. 일반적으로 기능의 일부를 제공하지 않기 때문에 추상으로 표시됩니다. 서브 클래스가이를 제공 할 것으로 기대합니다. – Kylar

+0

추상 공장 하위 클래스는 반환 할 인스턴스를 결정합니다. –

+0

여러분, 도와 줘서 고마워. 귀하의 답변을 읽은 후 상속 및 정적 메소드에 관한 Java 자습서를 다시 읽었으며 지금은 분명합니다. – tmakino

답변

16

추상 클래스는 추상 메소드를 가지고이없는 않습니다. 그게 보통 어떻게 이루어 졌는지입니다.

이제 Calendar.getInstance()에 의해 작동하며 실제로는 하위 클래스의 인스턴스를 만듭니다. 정적 메서드이기 때문에 호출 할 수 있습니다. 반환 값은 관련 하위 클래스의 인스턴스를 참조하지만 반환 유형은 그냥 Calendar이며 이는 일반적인 상속 규칙으로 인해 문제가되지 않습니다.

여기에 접근의 같은 종류의 예이지만, Calendar의 모든 복잡성없이 - 같은 원칙이 적용하십시오 GregorianCalender를 반환

abstract class AbstractParent { 
    public static AbstractParent getInstance() { 
     // Normally you'd have code to work out which 
     // concrete class to actually use 
     return new ConcreteChild(); 
    } 

    public abstract void sayHello(); 
} 

class ConcreteChild extends AbstractParent { 
    @Override public void sayHello() { 
     System.out.println("Hello from ConcreteChild"); 
    } 
} 

public class Test { 
    public static void main(String[] args) { 
     AbstractParent parent = AbstractParent.getInstance(); 
     parent.sayHello(); 
    } 
} 
1

추상 클래스는 정적 메서드를 구현할 수 있습니다 참조하십시오.

getInstance()는 추상 클래스의 기본 구현을 반환하는 정적 메서드입니다.

이 경우 실제로 GregorianCalendar 인스턴스를 반환한다고 생각합니다.

2

Calendar은 추상 클래스이므로 새 인스턴스를 만들 수 없습니다. 당신이 doc 보면, 그 위에 나열된 static Calendar 어떤 방법을 찾아 당신은 getInstance()을 발견 할 것이다, 그래서 당신은 같은 것을 할 수 있습니다 : - 당신이 다시 같은 문서를 보면

이제
Calendar cal = Calendar.getInstance(); 

,보고 페이지 상단 Direct Known Subclasses, 여기에 나열된 클래스 (들)이 경우에, 당신도이 같은 GregorianCalendar을 사용할 수 있습니다, 달력의 구현입니다 ... 그래서 : -

Calendar cal = new GregorianCalendar(); 

두 작품 .. .

1

getI Calendar 클래스의 nstance() 메서드는 Calendar 클래스의 객체를 반환하지 않고 "기본 시간대와 로케일"이있는 경우 Calendar의 하위 클래스 인 GregorianCalendar를 반환합니다. :)

관련 문제