2016-06-12 18 views
1

Ich versuche, abstrakte Klassen in Java zu verstehen, so schrieb ich diesen Code-Schnipsel in IntelliJ:Warum kann ich diese abstrakte Klasse instanziieren?

AutoCloseable ac = new BufferedInputStream(new InputStream() { 
     @Override 
     public int read() throws IOException { 
      return 0; 
     } 
}); 

Der @Override und read() Stummel wurde automatisch von IntelliJ erstellt.

Da InputStream eine abstrakte Klasse ist, warum kann ich sie mit dem Schlüsselwort new instanziieren?


Und noch etwas. Wenn ich die Methode Stub wie folgt löschen:

AutoCloseable ac = new BufferedInputStream(new InputStream()); 

Die IDE sagt, dass InputStream abstrakt ist und daher nicht instanziiert werden kann (wie erwartet).

Also, warum ist das erstere gültig und das letzte nicht?

Und woher kommt diese read() Methode?

Antwort

4

Im ersten Beispiel wird InputStream nicht instanziiert. Sie instanziieren eine anonyme Klasse, die erweitert und implementiert die einzige abstrakte Methode von InputStream - read(). Diese anonyme Klasse ist nicht abstrakt, Sie können sie also instanziieren.

Auf der anderen Seite versucht new InputStream(), eine abstrakte Klasse zu instanziieren, was nicht möglich ist.

Verwandte Themen