Java i.o FilterInputStream

Java i.o FilterInputStream,java,java-io,Java,Java Io,FilterInputStream类是否可以被分类为实例化类 我很难理解这一点,这不是一个抽象类,但它有一个受保护的构造函数,这意味着只有子类可以实例化它 现在我说FilterInputStream类是否可以实例化? 因为如果我尝试这样的事情: FilterInputStream fis = new FilterInputStream(null); 它会抱怨,但当然如果你说 FilterInputStream fis = new DataInputStream(null); 比这更好用 对于

FilterInputStream类是否可以被分类为实例化类

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

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

FilterInputStream fis = new FilterInputStream(null);
它会抱怨,但当然如果你说

FilterInputStream fis = new DataInputStream(null);
比这更好用

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


无论如何,我很乐意得到一个意见。谢谢。

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

FilterInputStream没有公共构造函数(它受保护-),因此无法直接实例化它。DataInputStream是从FilterInputStream派生的(DataInputStream确实有一个公共构造函数),因此可以对其进行实例化。

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

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

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

FilterInputStream类是否可以被分类为实例化类

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

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

  • 您应该能够使用反射来查找
    受保护的
    构造函数,重写其访问,并调用它来创建
    FilterInputStream
    实例

这两种方法都会创建一个对象,该对象是
FilterInputStream
的实例,而不是任何子类型

相比之下:

  • 如果
    FilterInputStream
    被声明为
    abstract
    ,第一种方法将给出编译错误,第二种方法将导致异常

  • 在第二个示例中,所创建对象的真实类型是
    DataInputStream
    。这个“is-a”
    FilterInputStream
    instanceof
    也会这样说。但是对它调用
    getClass()
    将告诉您它的真正类型。(如果
    DataInputStream
    不以不符合API约定的方式覆盖行为,则其行为将仅与
    FilterInputStream
    类似。)



1-但这里有一个实际问题。
java.io
包通过约定和JVM安全性有效地“关闭”。这意味着“普通”应用程序无法将类添加到
java.io
包中。这实际上关闭了这种方法。。。除非您准备对JVM进行“修补”。

这只是语义,但语义不仅仅是琐事。在这种情况下,这只是一个语义问题,这让情况变得混乱。我不知道“仅语义问题”是什么意思,我也不明白为什么这会让任何人感到困惑。编程语言充满了“语义问题”。这是其中之一。人类语言不同于计算机语言。我们所说的这种情况对正在发生的事情绝对没有影响。我们可以争论您是否正在“实例化
FilterInputStrea
”,但这并不会改变代码实际执行的操作。这就是代码的好处——它不在乎我们称之为各种进程,也不在乎我们如何命名。只有我们在做什么才重要,而不是我们说我们在做什么。语义学不是关于“我们称之为什么”的东西:而是关于它们的意义。我所说的语义是Java编程语言的语义规则,由编译器强制执行。