2

我正在学习java编程。
当我浏览课程示例时,我看到了下面的代码

Scanner input = new Scanner (System.in)

我知道它声明了一个 Scanner 变量输入,但我想知道为什么我应该声明这样的变量而不是通过直接调用 Scanner 类中的方法来使用这个函数?

4

4 回答 4

4

您应该将 a 声明Scanner为变量,因为Scanner该类不是静态的。

让我们分解任务:

  1. 首先,你有Scanner input. 这表明 name 的变量input将被分配为Scanner.
  2. 然后,你有new Scanner,它告诉 Java 你正在创建一个新Object的类型Scanner来存储在 field 中input
  3. 然后,您正在调用扫描仪类的构造函数。更具体地说,您使用以下值调用它:System.in

这是这里至关重要的第三步。由于您是新手,如果您不了解static修饰符,我会在尝试处理之前先查一下。

您的新 Scanner 在其构造函数中有一个参数:InputStream. AnInputStream是一个接口,例如,一个键盘。这就是你不能调用的原因Scanner.next():如果你想有两个不同的输入流怎么办?

通过创建变量input,您将Scanner 特定于 System.in的变量存储在该变量中。如果你有一个文件,你可能需要另一个 Scanner 作为它的 InputStream (虽然文件不是真正以这种方式读取的,但你明白了。)

如果 Scanner 的功能是静态的,那么您将只能拥有一个 Scanner。这意味着通过 Scanner 将用户限制为仅一个输入流。

于 2013-01-12T06:51:09.523 回答
2

为什么我应该通过直接调用类 Scanner 中的方法来声明这样的变量而不是使用这个函数?

只有一个static方法可能会像你建议的那样被调用。大多数Scanner值得一提的方法都不是static

于 2013-01-12T06:45:02.603 回答
1

看语句——Scanner input = new Scanner (System.in);

我们可以把它分成两部分 -
(1)创建一个名为的引用来保存赋值左侧的input任何类型的变量。(2)在赋值的右侧实例化一个类型的对象。最后,为类型的实例/对象分配新创建的变量。 Scanner
ScannerScanner

现在来回答你的问题——

为什么我应该通过直接调用类 Scanner 中的方法来声明这样的变量而不是使用这个函数?

因为在Scanner类中没有这样的方法可以返回扫描仪类型变量以分配新创建的变量input。此外,要在类中调用函数而不创建类的对象,该方法应该是“静态的”。

于 2015-04-04T20:01:14.047 回答
0

您将需要阅读更多关于 OOP 的信息。但本质上,您要问的是能够直接调用类的方法,称为类的静态方法。它们不受任何特定实例的约束。静态方法不知道任何特定于实例的数据。在这种情况下,InputStream 传入构造函数。

由于我不知道您指的是哪个特定的 Scanner 类,因此我假设编写该类的人认为访问 InputStream 作为函数的数据成员很有用。因此它是这样设计的。

一般来说,在 OOP 中,事情就是这样设计的。用数据实例化对象,并在对象上调用函数。静态方法的使用可以说在一定程度上打破了 OOP 架构。

我希望这能澄清一些事情。

于 2013-01-12T06:51:19.890 回答