FilterInputStream类可以归类为实例化类吗?
我正在努力理解这一点,这不是一个抽象类,但它有一个受保护的构造函数,这意味着只有子类可以实例化它。
现在我说FilterInputStream类是否可以实例化? 因为如果我尝试这样的事情:
FilterInputStream fis = new FilterInputStream(null);
它会抱怨,但当然如果说
FilterInputStream fis = new DataInputStream(null);
比这个工作得好。
很抱歉这样的新手问题,我倾向于认为这可能与java i.o无关。但这是一个更多与访问控制和可能更广泛的OOP概念有关的问题。
无论如何,我很乐意对此发表意见。感谢。
答案 0 :(得分:1)
FilterInputStream类可以归类为实例化类吗?
是的,它可以。它可以通过两种方式直接实例化:
由于构造函数是protected
,因此java.io
包中的其他类可以访问它,无论它们是否为FilterInputStream
的子类。因此,java.io
包中的任何类都应该能够创建FilterInputStream
个实例 1 。
您应该能够使用反射来查找protected
构造函数,覆盖其访问权限,并调用它来创建FilterInputStream
实例。
这两个都会创建一个FilterInputStream
实例而不是任何子类型的对象。
相比之下:
如果FilterInputStream
被声明为abstract
,则第一种方法会产生编译错误,第二种方法会导致异常。
在第二个示例中,正在创建的对象的真实类型是DataInputStream
。这个“is-a”FilterInputStream
和instanceof
也会这样说。但是在它上面调用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)