2017-07-14 4 views
3
public class Main { 

public static class ClassBase { 

    public void test() { 
     System.out.println("1"); 
    } 

} 

public static interface Interface { 

    default void test() { 
     System.out.println("2"); 
    } 

} 

public static class MyClass extends ClassBase implements Interface { 

} 

public static void main(String[] args) { 
    new MyClass().test(); 
} 

} 

In diesem Beispiel wird es immer drucken 1. 2 zu drucken, ich test in MyClass und zurück Interface.super.test() außer Kraft setzen müssen.Interaktion zwischen erweiterten Klasse und implementierte Schnittstelle

Gibt es eine Möglichkeit, die Methode Interface::test die Methode ClassBase::test zu überschreiben, ohne die Methode in MyClass manuell zu überschreiben? (um im Beispiel 2 zu drucken)

+0

Gibt es einen Weg? Sicher, mach die Schnittstelle zu einer Klasse und die Klasse zu einer Schnittstelle. – shmosel

+0

@shmosel Das Problem ist, dass die Klasse, die ich verwende, von einer API stammt, und ich kann sie nicht ändern. Ich wollte eine Schnittstelle erstellen, um einige Methoden aus dieser Klasse automatisch zu überschreiben (ich werde viel Zeit wiederverwenden, so dass weniger Code benötigt wird), aber es funktioniert nicht. – Franckyi

+0

Sieht so aus, als ob Ihre Klasse nur die Schnittstelle implementieren soll. Wenn das der Fall ist, lassen Sie MyClass nicht ClassBase erweitern – Anil

Antwort

3

Wenn eine Klasse in der Hierarchie eine Methode mit derselben Signatur hat, werden Standardmethoden irrelevant. Eine Standardmethode kann eine Methode von java.lang.Object nicht überschreiben. Die Argumentation ist sehr einfach, weil Object die Basisklasse für alle Java-Klassen ist. Selbst wenn wir Object-Klassenmethoden als Standardmethoden in Interfaces definiert haben, ist dies nutzlos, da die Object-Klassenmethode immer verwendet wird. Um Verwirrung zu vermeiden, können wir daher keine Standardmethoden verwenden, die Methoden der Object-Klasse überschreiben.

Fazit: Standardmethode kann nicht Instanz-Methode überschreiben.

+0

Nun, danke für die Information, das habe ich mir gedacht. – Franckyi

+0

Wenn Sie etwas zitieren, sollten Sie einen Link zur Quelle hinzufügen. – Holger

Verwandte Themen