Java i.o FilterInputStream

时间:2013-09-19 23:05:37

标签: java java-io

FilterInputStream类可以归类为实例化类吗?

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

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

FilterInputStream fis = new FilterInputStream(null);

它会抱怨,但当然如果说

FilterInputStream fis = new DataInputStream(null);

比这个工作得好。

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

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

4 个答案:

答案 0 :(得分:1)

  

FilterInputStream类可以归类为实例化类吗?

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

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

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

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

相比之下:

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

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


1 - 这里有一个实际问题。 java.io包按照约定和JVM安全性有效地“关闭”。这意味着“普通”应用程序无法向java.io包添加类。这有效地关闭了这种方法......除非你准备好“修补”JVM。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

FilterInputStream没有公共构造函数(它受保护 - see the javadoc),因此您无法直接实例化它。 DataInputStream派生自FilterInputStream(DataInputStream确实有公共构造函数),因此可以实例化。

答案 3 :(得分:-1)

使用找到的here逻辑,虽然您不能(在子类之外)实例化FilterInputStream,但您仍然可以(正如您在第二个示例中所做的那样)获取instance { {1}}。

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

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