【问题标题】:What does this statement mean and ...?这句话是什么意思和...?
【发布时间】:2011-10-15 07:40:28
【问题描述】:

最近我遇到了这样的说法:

InputStream in = new FileInputStream(Filename);

这句话是什么意思?

in 指的是什么?

inFileInputStream的对象吗?

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

【问题讨论】:

    标签: java io


    【解决方案1】:

    此语句利用了继承的影响。您正在创建 FileInputStream 对象的新实例并将其分配给 in 变量。

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

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

    【讨论】:

      【解决方案2】:

      是的inInputStream 类型的对象的名称(这是一个抽象类) 可能有许多类扩展了该抽象类(包括FileInputStream)——每个类都实现了所需的组件InputStream.

      您可以创建您正在使用的类的确切类型的特定对象,但通过使用抽象版本或接口 - 您可以保证该类具有一定的功能集,但您可以轻松切换实际实现,而无需更改代码。 (继承在行动!)

      例如上面的行以后可以改用:

      InputStream in = new SocketInputStream();
      

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

      【讨论】:

        【解决方案3】:

        in 是变量的名称,而您正在存储 InputStream 的实例。

        【讨论】:

          【解决方案4】:

          你基本上是在打开一个文件来阅读。

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

          【讨论】:

            【解决方案5】:

            in 是这里选择的变量名,它拥有一个类为 FileInputStream 的对象。抽象类 InputStream 定义构造函数的原因是它强制(非抽象)子类实现它。

            【讨论】:

              【解决方案6】:
              1. 标识符“in”指的是 InputStream 对象。在这种情况下,它确实引用了构造函数创建的 FileInputStream 对象。这是可能的,因为...

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

              FileInputStream 扩展 InputStream。

              【讨论】:

                【解决方案7】:

                InputStream 是一个抽象类,所以不能直接实例化。您只能分配它的子类的实例,在本例中为 FileInputStream。

                下一个明显的问题是为什么不能将它分配给 FileInputStream?对这个问题的回答是理解继承、抽象类和松散耦合的概念。简单地说,明天如果你想改变你的代码,而不是从文件中读取它,而是从一个 URL 中读取它......你可以通过将 FileInputStream 更改为 URLInputStream(你必须写这个),它也扩展了抽象 InputStream 类....

                【讨论】:

                  【解决方案8】:

                  以下是关于为什么抽象类具有可能相关的构造函数的现有解释:

                  Why do abstract classes in Java have constructors?

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

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

                  【讨论】:

                    猜你喜欢
                    • 2013-07-11
                    • 1970-01-01
                    • 2013-05-28
                    • 2023-03-23
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-01-05
                    • 2021-12-25
                    相关资源
                    最近更新 更多