2016-04-11 4 views
1

ich die folgenden Klassen und Schnittstelleneine nicht abstrakte Klasse erweitern und eine Schnittstelle mit dem gleichen Verfahren Signaturen in einer Klasse Umsetzung

public class A { 
    public void printSomething() { 
    System.out.println("printing from A"); 
    } 
} 

interface B { 
    public void printSomething(); 
} 

public class C extends A implements B { 
    public static void main(String aa[]) { 
    C c = new C(); 
    c.printSomething(); 
    } 
} 

habe, wenn ich den obigen Code zu kompilieren, kompiliert es ohne Fehler. Und wenn ich das Programm starte, druckt es Folgendes.

printing from A 

Ich hatte erwartet, den Compiler einen ähnlichen Fehler wie der folgende Fehler zu geben, die ich habe, wenn meine Klasse C nicht Klasse A

C.java:1: error: C is not abstract and does not override abstract method printSomething() in B public class C implements B{ 
    ^
C.java:8: error: cannot find symbol 
         c.printSomething(); 
         ^
    symbol: method printSomething() 
    location: variable c of type C 
2 errors 

erweitern wusste ich, dass, wenn eine Klasse implementiert ein Interface müssen wir dann die Interface-Methoden in der Klasse definieren oder die Klasse abstract deklarieren. Aber dann, wie nur durch die Erweiterung einer Klasse (mit einer definierten Methode der gleichen Signatur) bin ich in der Lage, diese Compiler-Warnung zu überwinden und das Programm ebenfalls auszuführen.

+6

Es ist, weil Sie diese Methode aus der Superklasse erben. Die Methode muss zur Verfügung gestellt werden, und durch Vererbung ist es – Stultuske

+0

Warum haben Sie das erwartet? Vererbung bedeutet, dass ein "C" als ein "A" behandelt werden kann; und 'A' hat diese Methode ... –

+0

die' interface' Kräfte Implementierung haben Sie Zugang zu dem in der 'interface' in der Klasse definiert haben, nicht wirklich zu haben, es in der Klasse geschrieben, die die' interface' nicht implementiert . Wenn die Klasse von einer Klasse erbt, die die Methode bereits definiert hat und auf die sie zugreifen kann, werden die Bedingungen erfüllt und Sie müssen die Methode nicht erneut überschreiben. – SomeJavaGuy

Antwort

2

Es ist absolut in Ordnung, das zu tun und ist überraschend häufig.

Sie class A verwenden als ein Werkzeug für die die interface von interface B angegebenen Implementierung.

Diese Art von Muster erleichtert die Modularisierung und das Potenzial für die Wiederverwendung von Code.

+0

Sie meinen also, wenn ich eine Standardimplementierung zu einer Funktion möchte, kann ich das mit dem obigen Muster erreichen? Und überschreiben Sie die Funktion in einer der Unterklassen wo erforderlich –

+0

Absolut.'Klasse C' kann eine eigene Implementierung von' printSomething' bereitstellen, wenn Sie etwas anderes machen wollen. – Bathsheba

+0

Danke !! Das hat geholfen –

0

Dies liegt daran, C Kind von A. ist Auftragnehmer Wenn Child Standard ausgeführt wird, bekommt die Mutter Konstruktor aufgerufen (dies ist alles Eigentum von A zu erben). In diesem Fall hat "new C()" alle Eigenschaften von A() für die Klasse C einschließlich printSomething() verfügbar gemacht.

+0

was hat den Konstruktor der Superklasse aufgerufen, damit zu tun? Sie rufen Sie nicht, dass Konstruktor „alle die Eigenschaft erben“, es sicher zu machen heißt, dass die Super-Klasse-Mitglieder – Stultuske

+0

die Super-Klasse Mitglieder instanziiert instanziiert werden, was bedeutet, dass ein Speicherblock auf die Ressourcen zugewiesen wird, die durch zugänglich sind die untergeordneten Elemente bei Bedarf (außer privaten Ressourcen). Dies ist nichts anderes, als indirekt alle Ressourcen für seine Kinder zu öffnen. –

+0

ist es das Schlüsselwort "extends", das Zugriff auf die (nicht privaten) Super-Mitglieder gibt. – Stultuske

0

Dies liegt daran, durch class A in class C erstreckt, die Sie tatsächlich Umsetzung der printSomething() Methode der interface B bereitstellt.

Bitte beachten Sie:, class A bestehen eine Implementierung von printSomething() Methode.

Verwandte Themen