在创建FileInputStream对象时使用InputStream而不是FileInputStream有什么不同
这可能是一个愚蠢的,但我想知道背景操作的差异。
InputStream is = new FileInputStream(filepath);
-
FileInputStream is = new FileInputStream(filepath);
上面两行代码之间的区别是什么,以及它们使用的场景。
FileInputStream
扩展了InputStream
:它是一个专门用于读取文件的InputStream版本。
根据它的使用,有几种InputStream实现。
通常,最好使用代码中所需的最高类型。 因此,如果您的代码需要从InputStream
读取数据,而不是从FileInputStream
专门读取数据,则应使用InputStream
。 但是,如果您确实需要将对象的信息保持为FileInputStream
而不仅仅是InputStream
,那么您应该保留FileInputStream
类型。
没有真正的区别。 FileInputStream
扩展了InputStream
,因此您可以将InputStream
对象指定为FileInputStream
对象。 最后,它是同一个对象,因此会发生相同的操作。
这种行为称为多态 ,在面向对象编程中非常重要。
您的第一行代码可能比第二行更令人满意,因为它不会将您锁定到FileInputStream
。
这是面向对象编程的优势之一。 不指定类型允许您更改以后使用的流类型。 如果您确定此处只需要FileInputStream
,请使用第二行代码。
与其他答案状态一样,行为没有区别。 它仍然是相同的对象,并且将执行相同的方法。 您可以将任何inheritanceInputStream
类型的对象分配给该变量。
但是,到目前为止没有人提到的是:您只能调用在该变量上的InputStream
中声明的操作。 如果FileInputStream
会提供一些额外的操作,如果你试图调用它,编译器会抛出一个错误。 在这种情况下,您需要使用FileInputStream
作为变量的类型。
其他答案几乎已经钉了它,但我想添加以下内容。
如果引用变量的类型严格is
是类的内部实现细节 ,即没有其他类可以直接或间接地找到它,那么这两个语句之间确实没有区别,即使我会针对更基本的类型(InputStream)只是因为。
但是,如果通过类的接口甚至出现了一点点泄漏FileInputStream特定行为的提示,如果这对您要解决的问题不是必不可少的,那么您应该始终针对更基本的类型进行编程。
当然,这是一般的良好实践,并且不仅适用于InputStream等。
没有区别。 在每种情况下,您都在创建FileInputStream
。 第一种可能是更好的编程风格,因为您通常应该使用类interface
而不是具体类来允许灵活性(即您决定使用BufferedInputStream
)。