2017-02-12 4 views
6

Ich frage nicht nach dem Unterschied zwischen der Schnittstelle und der abstrakten Klasse.Statische und nicht statische Methoden mit demselben Namen in der übergeordneten Klasse und der implementierenden Schnittstelle

Es ist Arbeitserfolg individuell, oder?

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

Warum bekommt es einen Konflikt?

+3

Was ist die Frage? – shmosel

Antwort

7

Eine static und nicht static Methode kann nicht den gleichen Namen in der gleichen class haben. Dies liegt daran, dass Sie mit einer Referenz sowohl auf eine static-Methode als auch auf eine static-Methode zugreifen können. Der Compiler kann dann nicht entscheiden, ob Sie die Methode static oder die Methode static aufrufen möchten.

Betrachten Sie den folgenden Code beispielsweise:

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

Der Grund, warum Java erlauben kann ein static Methode eine Referenz genannt werden verwendet, ist es Entwicklern zu erlauben ein static Verfahren zu einem nicht static Verfahren nahtlos zu ändern .

2

Wir müssen unseren Code so schreiben, dass er syntaktisch korrekt ist. Genauso wichtig ist es zu verstehen, dass unser Code dem Compiler keine Mehrdeutigkeit verleiht. Falls eine solche Mehrdeutigkeit vorliegt, haben die Sprachentwickler darauf geachtet, dass der Code nicht kompiliert wird.

Eine Klasse erbt die Verhaltensweisen ihrer Superklasse. Sie können auf statische Methoden zugreifen, indem Sie einfach den Klassennamen und auch die Instanz verwenden. Angenommen, es gibt eine Methode mit demselben Namen und derselben Signatur (mit Ausnahme des Schlüsselworts static), wird beim Aufrufen der Methode für die Instanz der Compiler für einen Toss ausgeführt. Wie wird es entscheiden, was der Programmierer beabsichtigt zu tun, welche der beiden Methoden will er oder sie anwenden? Daher haben die Sprachdesigner entschieden, dass dieser Fall zu einem Kompilierungsfehler führt.

Wie pro

http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.8.2

Wenn eine Klasse C erklärt oder erbt eine statische Methode m, dann m gesagt wird jede Methode m‘zu verbergen, wobei die Unterschrift von m ein Untersignatur ist (§8.4.2) der Signatur von m ', in den Oberklassen und Superschnittstellen von C, die sonst für Code in C zugänglich wären. Es ist ein Fehler bei der Kompilierung, wenn eine statische Methode eine Instanzmethode ausblendet.

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

* statische Methode kann mit einer Instanz * aufgerufen werden. Nee. Nichts in * Java * kann über eine Instanz aufgerufen werden. (Atleast nicht von dem Programmierer) – CKing

Verwandte Themen