2011-12-11 5 views
18

Mam dwie klasy, które rozszerzają tę samą klasę abstrakcji. Obie potrzebują tej samej stałej, ale o różnych wartościach. Jak mogę to zrobić? Przykładowy kod pokazujący, co chcę zrobić.Nadpisywanie stałych w Javie

abstract class A { 
    public static int CONST; 
} 

public class B extends A { 
    public static int CONST = 1; 
} 

public class C extends A { 
    public static int CONST = 2; 
} 

public static void main(String[] args){ 
    A a = new B(); 
    System.out.println(a.CONST); // should print 1 
} 

Powyższy kod nie jest kompilowany, ponieważ CONST nie jest zainicjalizowany w klasie A. Jak mogę go uruchomić? Wartość CONST powinna wynosić 1 dla wszystkich instancji B i 2 dla wszystkich instancji C, i 1 lub 2 dla wszystkich instancji klasy A. Czy istnieje jakikolwiek sposób na użycie tej statystyki?

Odpowiedz

21

Nie możesz tego zrobić.

Można to zrobić, jednakże:

abstract class A { 
    public abstract int getConst(); 
} 

public class B extends A { 
    @Override 
    public int getConst() { return 1; } 
} 

public class C extends A { 
    @Override 
    public int getConst() { return 2; } 
} 

public static void main(String[] args){ 
    A a = new B(); 
    System.out.println(a.getConst()); 
} 
+0

Dziękujemy! Żałuję tylko, że nie mogę użyć statycznego, ponieważ wartości nie różnią się od jednej instancji B do drugiej. – Fractaly

+0

@Fractaly: Ale różnią się one od wystąpienia "A" do innego. –

+1

should not getConst() in A be abstract? – Fractaly

5

Jeśli stała ma wartość zmienną, nie jest już stała. Pola i metody statyczne nie są polimorficzne. Musisz użyć publicznej metody, aby zrobić to, co chcesz.