2011-07-02 8 views
10

Java에서 추상 클래스의 인스턴스를 만들 수 없습니다. 그럼 왜 다음 코드에 대해 비명을 지르지 않습니까?Java : 추상 클래스의 최종 변수

public abstract class FooType { 
    private final int myvar; 

    public FooType() { 
     myvar = 1; 
    } 
} 
+0

왜 처음에 "비명을 지르는"것이 좋을까요? – aps

+0

중요한 장소 (생성자 또는 생성자 자체의 할당) 아래에 빨간색 선이 깜박입니다. – imacake

답변

13

코드는 괜찮습니다. 최종 변수는 생성자 FooType에서 초기화됩니다.

추상적이기 때문에 FooType을 인스턴스화 할 수 없습니다. 그러나 FooType의 추상이 아닌 하위 클래스를 만들면 생성자가 호출됩니다.

생성자에서 super(...)에 대한 명시 적 호출이 없으면 Java 컴파일러가이를 자동으로 추가합니다. 따라서 상속 체인에있는 모든 클래스의 생성자가 호출되도록 보장합니다.

0

FooType의 구체적인 하위 클래스를 만들 수 있으며 모두 myvar라는 최종 필드가 있습니다.

BTW : 추상 클래스의 Apublic 생성자는 서브 클래스에서만 호출 할 수 있으므로 protected과 같습니다.

당신의 의심은 무엇입니까?

+0

일식이 먹는 이유가 무엇입니까? 정적 인 컨텍스트에서 아이콘 라이브러리를 만들고 싶습니다. 하지만 디스크에서로드하고 싶었으므로 최종 및 정적을 한 번에 사용할 수 없습니다. – imacake

+0

문제가 무엇인지 잘 모릅니다. 정적 및 최종 디스크에서로드하는 객체에 대한 참조를 만들 수 있습니다. –

3

비 추상 클래스에서도 가질 수있는 추상 클래스의 모든 것을 생성자, 메서드, 속성, 모든 것으로 가질 수 있습니다. 클래스를 인스턴스화 할 수 없습니다. 따라서이 코드에는 아무런 문제가 없습니다. 파생하는 클래스에서

당신은 생성자를 호출하고 마지막 프라퍼티 설정할 수 있습니다 당신이 슈퍼(),이 컴파일러에 의해 어쨌든 삽입됩니다에 대한 호출을 지정하지 않은 경우

public class Foo extends FooType 
{ 
    public Foo() 
    { 
    super(); // <-- Call constructor of FooType 
    } 
} 

합니다.

0

확인. 보십시오, 추상 클래스는 생성자를 가질 수 있습니다. 항상 암묵적이거나 명시 적입니다. 실제로 추상 클래스의 서브 클래스의 객체를 만들 때, 그 서브 클래스의 생성자가하는 첫 번째 작업은 super()를 사용하여 추상 수퍼 클래스의 생성자를 호출하는 것입니다. 이는 단지 매개 변수화 된 생성자를 사용하지 않는 한 super()을 명시 적으로 작성하지 않아도된다는 것을 이해합니다. 모든 클래스는 추상적 인 경우에도 볼 수없는 암시 적 생성자가 있습니다. 그것은 당신 자신의 생성자를 생성하지 않는 한 호출됩니다. 오랫동안 사용자 정의 생성자를 만들지 않고 추상 클래스를 만들었으므로 암시 적 생성자의 존재에 대해 알지 못했습니다.

0

아니요 최종 변수를 추상 클래스 내에서 선언 할 수 없습니다. 아래의 예를 확인하십시오.

public abstract class AbstractEx { 
    final int x=10; 
    public abstract void AbstractEx(); 
} 

public class newClass extends AbstractEx{ 

    public void AbstractEx(){ 
     System.out.println("abc"); 
     } 
    } 

public class declareClass{ 
    public static void main(String[] args) { 
     AbstractEx obj = new newClass(); 
     obj.AbstractEx(); 
     // System.out.println(x); 
    } 
} 

이 코드는 올바른 실행

ABC

로 출력을 생성하지만 우리는

에서 System.out.println의 (x)의 주석 기호 제거하는 경우,을

오류가 발생합니다.

관련 문제