2011-07-02 17 views
10

W języku Java nie mogę tworzyć wystąpień klas abstrakcyjnych. Dlaczego więc eclipse nie krzyczy o następującym kodzie?Java: Zmienne końcowe w klasach abstrakcyjnych

public abstract class FooType { 
    private final int myvar; 

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

dlaczego uważasz, że powinna ona "krzyczeć" w pierwszej kolejności? – aps

+0

@aps czerwone linie poniżej krytycznego miejsca (przypisanie w konstruktorze lub sam konstruktor) – imacake

Odpowiedz

13

Kod jest w porządku, ostatnia zmienna jest inicjowana w konstruktorze FooType. Nie można utworzyć wystąpienia FooType z powodu tego, że jest abstrakcyjny. Ale jeśli utworzysz nie abstrakcyjną podklasę o numerze FooType, zostanie wywołany konstruktor.

Jeśli nie masz wyraźnego połączenia z super(...) w konstruktorze, kompilator Java doda go automatycznie. Dlatego jest zapewnione, że wywoływany jest konstruktor każdej klasy w łańcuchu dziedziczenia.

0

Można tworzyć konkretne podklasy FooType i będą one miały ostateczne pole o nazwie myvar.

BTW: Konstruktor klasy abstrakcyjnej jest taki sam jak protected, ponieważ można go wywołać tylko z podklasy.

Jakie są twoje wątpliwości?

+0

Ah, to dlaczego eclipse je. Zobacz, chciałem zrobić bibliotekę ikon w statycznym kontekście. Ale chciałem załadować dysk z dysku, więc nie mogę używać końcowych i statycznych jednocześnie. – imacake

+0

Nie jestem pewien, na czym polega problem. Możesz utworzyć odwołanie do obiektu ładowanego z dysku statycznego i końcowego. –

3

Możesz mieć konstruktory, metody, właściwości, wszystko w klasach abstrakcyjnych, które możesz mieć również w klasach nie abstrakcyjnych. Po prostu nie możesz utworzyć instancji klasy. Więc nie ma nic złego w tym kodzie.

W klasie wynikającymi można wywołać konstruktora i ustaw końcową właściwość:

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

jeśli nie podasz wywołanie super(), to zostanie wstawiony w każdym razie przez kompilator.

0

Ok. Zobacz, klasa abstrakcyjna może mieć konstruktor. Jest zawsze tam - ukryte lub wyraźne. W rzeczywistości, gdy tworzysz obiekt podklasy klasy abstrakcyjnej, pierwszą rzeczą, którą robi konstruktor podklasy, jest wywołanie konstruktora jej abstrakcyjnej nadklasy przy użyciu super(). Jest to po prostu zrozumiałe, dlatego nie musisz jawnie pisać super(), chyba że użyjesz sparametryzowanych konstruktorów. Każda klasa, nawet jeśli jest abstrakcyjna, ma niejawny konstruktor, którego nie można zobaczyć. Jest wywoływany, chyba że utworzysz własny konstruktor. tak długo tworzyłeś klasy abstrakcyjne bez tworzenia w nim żadnego niestandardowego konstruktora, więc nie wiesz o istnieniu niejawnego konstruktora.

0

Nie można zadeklarować ostatecznych zmiennych wewnątrz klasy Abstract. Sprawdź poniższy przykład.

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); 
    } 
} 

Ten kod działa prawidłowe i produkować wyjście jako

abc

Ale jeśli usuwamy komentarz symbol

System.out.println (x);

spowoduje błąd.