2011-01-16 18 views
1

Wie pro The Java Programming Language(by Arnold Gosling) (ref pg. 275), wenn wir abstract ausdrücklich vor einer Methodendeklaration in einer Schnittstelle verwenden, können wirMit Stichwort abstrakt in Methoden in Java

die Methode Methode bei der Umsetzung Klasse überspringen.

Gemäß dem Beispiel:

interface Sheet{ 
    public double computeArea(); 
    public abstract double computePerimter(); 
} 

class Sphere implements Sheet{ 
    // Some data members and constructors. 

public double computeArea() { ... } 

    // No implementation of computePerimeter 
} 

Aber wenn ich versuche, ein Objekt der Klasse Kugel zu schaffen, habe ich gezeigt, einen Fehler up, dass der computePermeter Methode hasnt überlastet worden ist (das soll der Fall ist) . diese Methode implementating

Aber gemäß dem Zusammenhang könnte man die Methode skip wenn es explicitly declared als abstract gewesen .Allerdings es eine Klasse werden muss. Arent die Methoden in einer Schnittstelle implizit abstract ?? Oder interpretiere ich es falsch? Die explicit abstract hat verwirrt mich ein wenig .. bitte helfen .. alt text

alt text

alt text

+0

ehhh .. Kann ich "urheberrechtlich geschütztes Material" einfügen? – letsc

Antwort

0

Das Schlüsselwort abstract macht keinen Unterschied. Das einzige, was die Spezifikation sagt ist:

Aus Gründen der Kompatibilität mit älteren Versionen der Java-Plattform ist es erlaubt, aber aus Stil, den abstrakten Modifizierer für Methoden in Schnittstellen deklariert redundant anzugeben.

Ein schneller Test zeigt, dass das Schlüsselwort tatsächlich keinen Unterschied macht. Diese beiden sind beide gültig:

abstract class A implements B { } 
interface B { 
    public void meth(); 
} 

abstract class A implements B { } 
interface B { 
    public abstract void meth(); 
} 

und diese beiden sind beide ungültig:

class A implements B { } 
interface B { 
    public void meth(); 
} 

class A implements B { } 
interface B { 
    public abstract void meth(); 
} 
 
A.java:1: A is not abstract and does not override abstract method meth() in B 
class A implements B { } 
^ 
1 error 
1

Vor allem, wenn Ihre Klasse enthält eine abstract Methode als abstract deklariert werden muss. So: abstract class Sphere. Zweitens können abstract Klassen nicht instanziiert werden. Denken Sie an abstract Klassen als noch nicht fertig und nicht vollständig nutzbar. Ein interface kann von einer Klasse gedacht werden, die implizit alle Methoden abstract und public hat. Es definiert Verhalten nicht Implementierung.

+0

Yups, einverstanden, das ist, was ich zu glauben pflegte. Aber das Beispiel, das in gosling gegeben wird, zeigt die Klasse Sphere (abstrakte Klasse) und da Sphäre eine physische Entität darstellt, sollten wir es instantiieren können. Ich glaube nicht, dass ich genug wissen kann 2 kritisieren gosling .. das ist das Problem .. – letsc

+0

@smartmuki - IMHO, das Beispiel ist nur verwirrend. –

0

Soweit ich weiß, ist jede in einer Schnittstelle definierte Methode implizit abstract (und public). Wenn Sie jedoch Ihre Implementierungsklasse als abstract deklarieren, können Sie die Implementierung einer oder mehrerer in der implementierten Schnittstelle definierten Methoden überspringen.

+0

Ja, sowohl "public" als auch "abstract" sind in der Schnittstellendefinition unnötig, da sie implizit sind. – dty

0

Wenn Sie eine Schnittstelle implementieren, müssen Sie die Methoden der Schnittstelle implementieren oder sie als abstrakt deklarieren, wodurch die Klasse abstrakt wird.

1

Auszug aus den Java Language Specification:

Jede Methode Erklärung im Körper einer Schnittstelle ist implizit abstrakt, so dass ihr Körper immer durch ein Semikolon dargestellt wird, keinen Block.

Jede Methodendeklaration im Rumpf einer Schnittstelle ist implizit öffentlich.

Aus Gründen der Kompatibilität mit älteren Versionen der Java-Plattform ist es zulässig, aber aus Stilgründen zu vermeiden, den abstrakten Modifizierer für in Schnittstellen deklarierte Methoden redundant anzugeben.

Das Buch muss falsch sein oder zumindest einen verwirrenden Anspruch gestellt haben.

Edit: Das einzige, was mir einfällt, ist, dass Sie eine Schnittstelle implementieren können und die Methode abstrakt halten, um Javadoc hinzuzufügen.

interface Foo { 
    void bar(); 
} 

abstract class FooImpl implements Foo { 
    /** 
    * I want to put documentation here without implementing the method. 
    */ 
    abstract void bar(); 
} 

Dies hat jedoch keine Auswirkungen auf das Verhalten des Codes.

+0

danke .. ich wollte mich nur selbst davon überzeugen, dass "das Buch falsch sein muss" .. – letsc

0

effektiv eine abstrakte Klasse ist eine Teilschnittstelle und/oder alle Schnittstellen sind abstrakte Klassen.

interface Sheet{ 
    public double computeArea(); 
    public abstract double computePerimter(); 
} 

ist genau das gleiche wie

interface Sheet{ 
    public double computeArea(); 
    public double computePerimter(); 
} 

Abstrakte Klassen Klassen sind, die teilweise umgesetzt werden und nicht instanziiert werden können, weil sie nicht vollständig umgesetzt. Sie sind wie Schnittstellen, aber sie haben Körper zu einigen der Methoden ABER normalerweise nicht alle definiert (spielt keine Rolle, da Sie es abstrakt erklärten). Was es tut, erlaubt Ihnen, etwas von der Arbeit zu tun und den Rest durch die abgeleitete Klasse zu erledigen. Dies ist im Gegensatz zu einer Schnittstelle, wo die abgeleitete Klasse alle Methoden implementieren muss (was manchmal mühsam sein kann).