2013-07-08 58 views
14

这可能很愚蠢,但我想知道后台操作的差异。在创建FileInputStream对象时使用InputStream而不是FileInputStream有什么区别

  1. InputStream is = new FileInputStream(filepath);
  2. FileInputStream is = new FileInputStream(filepath);

是什么上面的代码两行之间以及在何种情况下使用它们的区别。

+0

FileInputStream是从InputStream派生的 - 任何FileInputStream实例都必须是InputStream。尽可能抽象地声明广泛的偏好。 – user888379

+0

在两种情况下你都做这件事没有区别。 – EJP

+1

可能的重复[Java - 从接口类型而不是类声明](http://stackoverflow.com/questions/3383726/java-declaring-from-interface-type-in​​stead-of-class) – Tom

回答

19

FileInputStream延伸InputStream:它是一个专门用于读取文件的InputStream版本。

根据使用情况,有几种InputStream的实现。

使用代码中所需的最高类型通常是很好的做法。因此,如果您的代码需要从InputStream读取数据,但不是专门从FileInputStream读取数据,则应该使用InputStream。但是,如果您确实需要保留对象的信息为FileInputStream而不仅仅是InputStream,那么您应该保留FileInputStream类型。

12

没有真正的区别。 FileInputStream扩展为InputStream,因此可以将InputStream对象指定为FileInputStream对象。最后,它是同一个对象,所以相同的操作会发生。

此行为被称为Polymorphism,在面向对象编程中非常重要。

您的第一行代码可能比第二行更合意,因为它不会将您锁定为FileInputStream

这是面向对象编程的强项之一。不指定类型允许您更改稍后使用的流类型。如果您确定这里只需要FileInputStream,请使用第二行代码。

2

没有区别。在每种情况下,您都会创建一个FileInputStream。第一种方法可能是更好的编程风格,因为通常应该使用类interface而不是具体的类以允许灵活性(即,您决定使用BufferedInputStream)。

4

与其他答案一样,行为没有差异。它仍然是相同的对象,将执行相同的方法。您可以将任何类型的对象分配给该变量,并继承InputStream

但是,到目前为止没有人提及的是:您只能调用在该变量中声明的InputStream中的操作。如果FileInputStream会提供一些额外的操作,如果您尝试调用它,编译器会发出错误。在这种情况下,您需要使用FileInputStream作为变量的类型。

3

其他的答案有很多钉,但我想补充下面的一点。

如果参考变量is的类型是严格类,即一个内部实现细节没有其他类会直接或间接地发现它,然而这两个语句之间确实没有什么区别,即使我会针对更基本的类型(InputStream)进行编程。但是,如果通过类的接口甚至有丝毫泄漏FileInputStream的特定行为,但如果没有这对于您正在尝试解决的问题至关重要,则应始终针对更基本的类型进行编程。

当然,这是一个普遍的良好做法,并且适用于比InputStream等更多的应用。

+0

好的补充,很好的工作。 –

相关问题