Pozostałe odpowiedzi zostały już prawie przybite, ale chciałbym dodać następujący fragment.
Jeśli typ zmiennej referencyjnej dotyczy wyłącznie wewnętrznej informacji o implementacji Twojej klasy, tj.żadna inna klasa nigdy się o tym nie dowie, bezpośrednio lub pośrednio, wtedy naprawdę nie ma różnicy między tymi dwoma stwierdzeniami, mimo że programowałem przeciwko bardziej podstawowemu typowi (InputStream) tylko dlatego.
Jednakże, jeśli istnieje nawet najmniejszy ślad wycieku specyficznego zachowania FileInputStream poprzez interfejs klasy, bez tego, że jest to istotne dla problemu, który próbujesz rozwiązać, zawsze powinieneś programować na bardziej podstawowy typ.
Oczywiście jest to ogólna dobra praktyka i dotyczy więcej niż InputStreams i tym podobnych.
FileInputStream pochodzi z InputStream - każda instancja FileInputStream jest z konieczności źródłem InputStream. Istnieje szersza preferencja, aby deklaracje były jak najbardziej abstrakcyjne. – user888379
Nie ma żadnej różnicy, ponieważ robisz oba w obu przypadkach. – EJP
Możliwy duplikat [Java - deklarowanie z typu interfejsu zamiast klasy] (http://stackoverflow.com/questions/3383726/java-declaring-from-interface-type-instead-of-class) – Tom