Musimy napisać nasz kod, aby był poprawny pod względem składni. Równie ważne jest zrozumienie, że nasz kod nie wprowadza żadnych niejednoznaczności dla kompilatora. W przypadku jakiejkolwiek takiej dwuznaczności, projektanci języka starają się nie dopuścić do kompilacji takiego kodu.
Klasa dziedziczy zachowania ze swojej super klasy. Dostęp do metod statycznych można uzyskać po prostu używając nazwy klasy, a także instancji. Załóżmy, że istnieje metoda o tej samej nazwie i sygnaturze (z wyjątkiem słowa kluczowego static
), wywołanie metody na instancji spowoduje pozostawienie kompilatora na podrzucenie. Jak zadecyduje, co zamierza zrobić programista, z której dwóch metod zamierza się odwoływać? Stąd projektanci języka zdecydowali, że ten przypadek spowoduje błąd kompilacji.
Zgodnie
http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.8.2
Jeśli klasa C stwierdza czy dziedziczy metody statycznej m, a m oznacza że do ukrycia sposobu, wszystkie m”, gdzie podpis m oznacza subsignature (§8.4.2) podpisu m ', w nadklasach i superinterfejsach C, które w przeciwnym razie byłyby dostępne dla kodu w C. Jest to błąd podczas kompilacji, jeśli statyczna metoda ukrywa metodę instancji.
public class Ov extends Am implements Inter {
public static void main(String[] args) {
Ov.fun(); //static method is intended to call, fun is allowed to be invoked from sub class.
Ov obj = new Ov();
obj.fun(); //** now this is ambiguity, static method can
//be invoked using an instance, but as there is
//an instance method also hence this line is ambiguous and hence this scenario results in compile time error.**
}
}
Jakie jest pytanie? – shmosel