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