Java 这句话是什么意思。。。?

Java 这句话是什么意思。。。?,java,io,Java,Io,最近我遇到了这样一种说法: InputStream in = new FileInputStream(Filename); 这句话是什么意思 在这里,中的指的是什么 中的是文件输入流的对象吗 编写语句:InputStream is=newinputstream()产生错误,因为InputStream是一个抽象类,但是为什么我们要为这个类设置构造函数呢?-->这个语句利用了继承的效果。您正在创建FileInputStream对象的新实例,并将其分配给in变量 对于这个变量的用户来说,他们只能看到

最近我遇到了这样一种说法:

InputStream in = new FileInputStream(Filename);
这句话是什么意思

在这里,中的
指的是什么

中的
文件输入流的对象吗


编写语句:
InputStream is=newinputstream()产生错误,因为InputStream是一个抽象类,但是为什么我们要为这个类设置构造函数呢?-->

这个语句利用了继承的效果。您正在创建
FileInputStream
对象的新实例,并将其分配给
in
变量

对于这个变量的用户来说,他们只能看到类型为
InputStream
的对象-它可以是抽象类
InputStream
的任何子类。在这一行之后,您可以调用此对象的
InputStream
类中声明的任何方法。即使对象实际上是一个
FileInputStream
,您也看不到这一点,因此无法调用这些方法(不强制转换)


构造函数的存在使得子类可以调用它来实例化和设置所有输入流所需的任何实例方法。您不能调用它,但子类可以调用它。

in
是变量的名称,而您存储的是
InputStream
的实例,基本上是打开一个文件进行读取


中的
是分配给输入流的变量。它属于InputStream类。

中的
是类型为
InputStream
的对象的名称(这是一个抽象类)。可以有许多类扩展该抽象类(包括
FileInputStream
),每个类都实现
InputStream
所需的组件

您可以创建一个特定的对象,该对象与您使用的类的类型完全相同,但是通过使用抽象版本或接口,您可以保证该类具有特定的函数集,但是您可以轻松地切换实际实现,而无需更改代码。(继承在起作用!)

例如,将来上述行可以使用:

InputStream in = new SocketInputStream();

有关更多信息,请阅读背景。

中的变量名是在此处选择的,它包含一个对象,该对象的类是FileInputStream。抽象类InputStream定义构造函数的原因是它强制(非抽象)子类实现它

  • 标识符“in”指的是InputStream对象。在本例中,它确实引用了构造函数创建的FileInputStream对象。这是可能的,因为


  • InputStream是一个抽象类。在Java中,抽象类可以有定义的方法(和构造函数),但是在扩展之前不能实例化它。扩展抽象类的子类必须调用抽象类的构造函数


  • FileInputStream扩展了InputStream。

    InputStream是一个抽象类,因此不能直接实例化。您只能分配其子类的实例,在本例中,该子类是FileInputStream


    下一个明显的问题是,为什么不能将其分配给FileInputStream?这个问题的答案是理解继承、抽象类和松耦合的概念。简单地说,明天如果您想更改代码,而不是从文件中读取代码,那么可以从URL中读取代码。。。您只需将FileInputStream更改为URLInputStream(您必须编写此文件),它还扩展了抽象InputStream类,就可以做到这一点,而不影响代码的其余部分。…

    下面是一个现有的解释,解释了为什么抽象类具有可能相关的构造函数:

    除此之外,我同意Rudu的答案,in,是我们程序中引用FileInputStream类实例的局部变量。在赋值中,它仅绑定到InputStream类型的局部变量这一事实意味着在这个范围内,编译器仅将它视为该类型。如前所述,您只能调用接口/抽象类上存在的方法。。输入流

    因此,虽然在运行时这将是FileInputStream类型的实例,但由于java静态类型系统以及继承和分配的实现,它在编译时只能作为InputStream使用