0

FilterInputStream 类是否可以归类为实例化类?

我很难理解这一点,这不是一个抽象类,但它有一个受保护的构造函数,这意味着只有子类可以实例化它。

现在我说FilterInputStream 类可以实例化还是不可以?因为如果我尝试这样的事情:

FilterInputStream fis = new FilterInputStream(null);

它会抱怨,但当然如果说

FilterInputStream fis = new DataInputStream(null);

比这很好用。

对于这样一个新手问题,我很抱歉,我倾向于认为这可能与 java io 无关,但它更多地与访问控制和可能更广泛的 OOP 概念有关。

无论如何,我很乐意就此发表意见。谢谢。

4

4 回答 4

1

FilterInputStream 类是否可以归类为实例化类?

是的,它可以。它可以通过两种方式直接实例化:

  • 由于构造函数是protected,因此包中的其他类可以访问它java.io,无论它们是否是FilterInputStream. 因此,包中的任何类java.io都应该能够创建FilterInputStream实例1

  • 您应该能够使用反射来查找protected构造函数,覆盖其访问权限,并调用它来创建FilterInputStream实例。

这两个都会创建一个对象,它是一个实例,FilterInputStream而不是任何子类型。

相比之下:

  • 如果FilterInputStream声明为abstract,第一种方法会产生编译错误,第二种方法会导致异常。

  • 在您的第二个示例中,正在创建的对象的真实类型是DataInputStream. 这个“是一个” FilterInputStreaminstanceof也会这么说。但是调用getClass()它会告诉你它的真正类型是什么。(只有在不以不符合 API 合同的方式覆盖行为的情况下,DataInputStream才会表现得像 a 。)FilterInputStream


1 - 这里有一个实际问题。按照惯例和 JVM 安全性,该java.io包实际上是“关闭”的。这意味着“普通”应用程序无法将类添加到java.io包中。这有效地关闭了这种方法......除非您准备“修补”JVM。

于 2013-09-20T00:33:18.893 回答
0

第二个示例实例化一个派生类,而不是 FilterInputStream 本身,然后将结果存储在 FilterInputStream 类型的引用中。这两个例子是不等价的。

于 2013-09-19T23:07:49.903 回答
0

FilterInputStream 没有公共构造函数(它受到保护 -请参阅 javadoc),因此您不能直接实例化它。DataInputStream 派生自 FilterInputStream (并且 DataInputStream 确实有一个公共构造函数),因此它可以被实例化。

于 2013-09-19T23:12:51.837 回答
0

使用此处找到的逻辑,虽然您不能(在子类之外)实例化FilterInputStream,但您仍然可以(就像在第二个示例中所做的那样获取FilterInputStream.

它比其他任何东西都更具语义。

编辑:根据此处解释的术语“实例化类” ,在您的第二个示例中,您实际上是在实例化FilterInputStream,因为DataInputStream它是 的子类FilterInputStream,因此被视为FilterInputStream.

于 2013-09-19T23:14:20.693 回答