2012-05-14 1 views
4

Les classes java.io.Reader et java.io.InputStreamReader les deux ont lu les méthodes avec exactement la même signaturejava.io dilemme

public int read(char[] charbuf, int offset, int length) throws IOException 

maintenant selon la documentation java les hérite java.io.FileReader de classe à la fois ces méthodes read() de à la fois les classes susmentionnées.

Maintenant que FileReader étend InputStreamReader qui étend encore lecteur

(Reader <-- Inputstreamreader <-- FileReader) 

et la lecture() a même signature dans les deux classes, il ne devrait pas avoir été que InputStreamReader l'emportaient sur la lecture() du lecteur et FileReader hérité cette méthode surchargée ?? Ou suis-je raté quelque chose ici ??

Les deux read() hérités par FileReader ont des fonctionnalités légèrement différentes (environ un bloc en attente d'entrée alors que l'autre ne le fait pas).

+0

Les docs ne disent pas "il hérite des deux", il ne fait que lister les méthodes héritées des superclasses, par superclasse. Il ne rentre pas et ne supprime pas les méthodes héritées des classes "plus haut" dans la chaîne d'héritage. –

+0

@dave: je viens de voir ..: p – WickeD

Répondre

4

La méthode dans InputStreamReader fournit l'implémentation de la méthode abstract dans Reader. FileReader ne remplace plus cette méthode; il hérite juste de l'implémentation de InputStreamReader.

Notez qu'il ya quatre signatures de lecture:

public int read() 
public int read(char[] cbuf, int offset, int length) 
public int read(char[] cbuf) 
public int read(CharBuffer target) 

InputStreamReader remplace seulement les deux premiers d'entre eux. Peut-être que c'est ce qui vous déroutait?

+0

j'ai envie de me donner un coup de pied !! thnx jon !! – WickeD

1

Eh bien, vérifions le code source, nous?

Classe Reader:

abstract public int read(char[] cbuf, 
    int off, 
    int len) throws IOException 

Ainsi, abstract, rien à voir ici.

Classe InputStreamReader:

public int read(char[] cbuf, 
    int offset, 
    int length) throws IOException 

{ 
     return sd.read(cbuf, offset, length); 
} 

Nous avons donc ici une substitution de la méthode de Reader.

Finalement, FileReader n'a pas de telle méthode définie, donc il l'hérite simplement de InputStreamReader.