2017-02-12 28 views
6

Nie pytam o różnicę między interfejsem a klasą abstrakcyjną.Metody statyczne i niestatyczne o tej samej nazwie w klasie nadrzędnej i interfejsie implementacyjnym

To działa sukces indywidualnie, prawda?

interface Inter { 
    public void fun(); 
} 

abstract class Am { 
    public static void fun() { 
     System.out.println("Abc"); 
    } 
} 

public class Ov extends Am implements Inter { 
    public static void main(String[] args) { 
     Am.fun(); 
    } 
} 

Dlaczego dochodzi do konfliktu?

+3

Jakie jest pytanie? – shmosel

Odpowiedz

7

Metoda static i inna niż static nie może mieć tej samej nazwy w tym samym class. Dzieje się tak dlatego, że można uzyskać dostęp do metody static i non static za pomocą odwołania, a kompilator nie będzie mógł zdecydować, czy chcesz wywołać metodę static, czy też inną niż static.

Rozważmy następujący kod na przykład:

Ov ov = new Ov(); 
ov.fun(); //compiler doesn't know whether to call the static or the non static fun method. 

Powodem Java mogą dopuścić metodę static na miano za pomocą odniesienia jest umożliwienie programistom, aby zmienić metodę static do nieprzestrzegania sposobu static bezproblemowo .

2

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.** 
    } 
} 
+0

* metoda statyczna może zostać wywołana za pomocą instancji *. Nie. Nic w * Java * nie może być wywołane przy użyciu instancji. (Najmniej nie przez programistę) – CKing