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