我正在学习java编程。
当我浏览课程示例时,我看到了下面的代码
Scanner input = new Scanner (System.in)
我知道它声明了一个 Scanner 变量输入,但我想知道为什么我应该声明这样的变量而不是通过直接调用 Scanner 类中的方法来使用这个函数?
您应该将 a 声明Scanner
为变量,因为Scanner
该类不是静态的。
让我们分解任务:
Scanner input
. 这表明 name 的变量input
将被分配为Scanner
.new Scanner
,它告诉 Java 你正在创建一个新Object
的类型Scanner
来存储在 field 中input
。System.in
。这是这里至关重要的第三步。由于您是新手,如果您不了解static
修饰符,我会在尝试处理之前先查一下。
您的新 Scanner 在其构造函数中有一个参数:InputStream
. AnInputStream
是一个接口,例如,一个键盘。这就是你不能调用的原因Scanner.next()
:如果你想有两个不同的输入流怎么办?
通过创建变量input
,您将Scanner
特定于 System.in的变量存储在该变量中。如果你有一个文件,你可能需要另一个 Scanner 作为它的 InputStream (虽然文件不是真正以这种方式读取的,但你明白了。)
如果 Scanner 的功能是静态的,那么您将只能拥有一个 Scanner。这意味着通过 Scanner 将用户限制为仅一个输入流。
为什么我应该通过直接调用类 Scanner 中的方法来声明这样的变量而不是使用这个函数?
只有一个static
方法可能会像你建议的那样被调用。大多数Scanner
值得一提的方法都不是static
。
看语句——Scanner input = new Scanner (System.in);
我们可以把它分成两部分 -
(1)创建一个名为的引用来保存赋值左侧的input
任何类型的变量。(2)在赋值的右侧实例化一个类型的对象。最后,为类型的实例/对象分配新创建的变量。 Scanner
Scanner
Scanner
现在来回答你的问题——
为什么我应该通过直接调用类 Scanner 中的方法来声明这样的变量而不是使用这个函数?
因为在Scanner
类中没有这样的方法可以返回扫描仪类型变量以分配新创建的变量input
。此外,要在类中调用函数而不创建类的对象,该方法应该是“静态的”。
您将需要阅读更多关于 OOP 的信息。但本质上,您要问的是能够直接调用类的方法,称为类的静态方法。它们不受任何特定实例的约束。静态方法不知道任何特定于实例的数据。在这种情况下,InputStream 传入构造函数。
由于我不知道您指的是哪个特定的 Scanner 类,因此我假设编写该类的人认为访问 InputStream 作为函数的数据成员很有用。因此它是这样设计的。
一般来说,在 OOP 中,事情就是这样设计的。用数据实例化对象,并在对象上调用函数。静态方法的使用可以说在一定程度上打破了 OOP 架构。
我希望这能澄清一些事情。