最近我发现了这个声明:
InputStream in = new FileInputStream(Filename);
这句话是什么意思?
这是in
所指的内容。
in
的对象是FileInputStream
吗?
编写语句: InputStream is = new InputStream();
产生错误b'coz InputStream是一个抽象类但是为什么我们为这个类设置了一个构造函数? ---&gt; < /强> InputStream()
答案 0 :(得分:3)
此声明正在利用继承的效果。您正在创建FileInputStream
对象的新实例,并将其分配给in
变量。
对于此变量的用户,他们只看到类型为InputStream
的对象 - 它可以是抽象类InputStream
的任何子类。在此行之后,您可以调用此对象上InputStream
类中声明的所有方法。尽管该对象实际上是FileInputStream
,但您无法看到它,因此无法调用这些方法(不进行强制转换)。
构造函数存在,以便子类可以调用它来实例化并设置所有输入流所需的任何实例方法。你不能调用它,但是子类可以调用它。
答案 1 :(得分:1)
是in
是InputStream
类型的对象的名称(它是一个抽象类)可能有许多类扩展该抽象类(包括FileInputStream
) - 每个类它实现了InputStream
。
您可以创建一个您正在使用的类的确切类型的特定对象,但是通过使用抽象版本或接口 - 您可以保证该类具有一定的功能集,但您可以轻松切换实际的实现改变代码。 (继承在行动!)
例如,以后的上述行可以改为使用:
InputStream in = new SocketInputStream();
有关详细信息,请阅读InputStream背景信息。
答案 2 :(得分:0)
in
是变量的名称,而您正在存储InputStream
的实例。
答案 3 :(得分:0)
您基本上是在打开文件进行阅读。
in
是您要分配给输入流的变量。它是InputStream类。
答案 4 :(得分:0)
in
是这里选择的变量名,它包含一个对象,其类是FileInputStream。抽象类InputStream定义构造函数的原因是它强制(非抽象)子类实现它。
答案 5 :(得分:0)
标识符“in”指的是InputStream对象。在这种情况下,它 引用由构造函数创建的FileInputStream对象。这是可能的,因为......
InputStream是一个抽象类。在Java中,抽象类可以具有已定义的方法(和构造函数),但是在扩展之前无法实例化它。扩展抽象类的子类必须调用抽象类的构造函数。
FileInputStream扩展了InputStream。
答案 6 :(得分:0)
InputStream是一个抽象类,因此无法直接实例化。您只能分配其子类的实例,在本例中为FileInputStream。
下一个显而易见的问题是为什么不能将它分配给FileInputStream?对这个问题的回答是理解继承,抽象类和松散耦合的概念。简单来说,明天如果你想改变你的代码,而不是从文件中读取它,从URL读取它...你可以通过将FileInputStream更改为URLInputStream而不影响其余代码来实现这一点你必须写这个,这也扩展了抽象的InputStream类....
答案 7 :(得分:0)
以下是为什么抽象类具有可能相关的构造函数的现有解释:
Why do abstract classes in Java have constructors?
除了这个添加之外,我同意Rudu的答案,在我们的程序中是一个引用类FileInputStream的实例的局部变量。事实上,在赋值中,它仅绑定到InputStream类型的局部变量,这意味着在此范围内,它仅被编译器视为此类型。如上所述,您只能调用接口/抽象类中存在的方法.InputStream。
因此,在运行时,这将是FileInputStream类型的实例,因为java静态类型系统以及继承和赋值的实现,它在范围内的编译时只能用作InputStream。