学过java的同学都应该知道,第一个程序很多人都是这样:
public class Hello {public static void main(String[] args) { System.out.print("Hello,world!");}
}
打印结果是:Hello,world!
接着可能会学习用户控制台输入Scanner的例子:
import java.util.Scanner;public class ScannerExample {public static void main(String[] args) {System.out.println("请输入第一个整数:");// 创建Scanner对象用于接收用户输入Scanner scanner = new Scanner(System.in); // 使用nextInt()方法读取一个整数int num1 = scanner.nextInt();System.out.println("请输入第二个整数:");// 再次使用nextInt()方法读取另一个整数int num2 = scanner.nextInt();// 计算两个整数的和int sum = num1 + num2;// 输出结果System.out.println("两个整数的和为:" + sum);// 关闭scannerscanner.close();}
}
这个代码很正常,提示用户输入两个整数,然后打印它们的和。
我把程序改成如下:
import java.util.Scanner;public class ScannerExample {public static void main(String[] args) {// 创建Scanner对象用于接收用户输入Scanner scanner = new Scanner(System.in);System.out.println("请输入第一个整数:");// 使用nextInt()方法读取一个整数int num1 = scanner.nextInt();System.out.println("请输入第二个整数:");// 再次使用nextInt()方法读取另一个整数int num2 = scanner.nextInt();// 计算两个整数的和int sum = num1 + num2;// 输出结果System.out.println("两个整数的和为:" + sum);// 关闭scannerscanner.close();}
}
使用vs code运行后竟然是这样:
第6行运行之后不应该停下来等我输入吗?怎么直接输出第8行的提示语句了啊?
查看了System的源码:
public final class System {/* Register the natives via the static initializer.** The VM will invoke the initPhase1 method to complete the initialization* of this class separate from <clinit>.*/private static native void registerNatives();static {registerNatives();}/** Don't let anyone instantiate this class */private System() {}/*** The "standard" input stream. This stream is already* open and ready to supply input data. Typically this stream* corresponds to keyboard input or another input source specified by* the host environment or user. In case this stream is wrapped* in a {@link java.io.InputStreamReader}, {@link Console#charset()}* should be used for the charset, or consider using* {@link Console#reader()}.** @see Console#charset()* @see Console#reader()*/public static final InputStream in = null;/*** The "standard" output stream. This stream is already* open and ready to accept output data. Typically this stream* corresponds to display output or another output destination* specified by the host environment or user. The encoding used* in the conversion from characters to bytes is equivalent to* {@link Console#charset()} if the {@code Console} exists,* <a href="#stdout.encoding">stdout.encoding</a> otherwise.* <p>* For simple stand-alone Java applications, a typical way to write* a line of output data is:* <blockquote><pre>* System.out.println(data)* </pre></blockquote>* <p>* See the {@code println} methods in class {@code PrintStream}.** @see java.io.PrintStream#println()* @see java.io.PrintStream#println(boolean)* @see java.io.PrintStream#println(char)* @see java.io.PrintStream#println(char[])* @see java.io.PrintStream#println(double)* @see java.io.PrintStream#println(float)* @see java.io.PrintStream#println(int)* @see java.io.PrintStream#println(long)* @see java.io.PrintStream#println(java.lang.Object)* @see java.io.PrintStream#println(java.lang.String)* @see Console#charset()* @see <a href="#stdout.encoding">stdout.encoding</a>*/public static final PrintStream out = null;/*** The "standard" error output stream. This stream is already* open and ready to accept output data.* <p>* Typically this stream corresponds to display output or another* output destination specified by the host environment or user. By* convention, this output stream is used to display error messages* or other information that should come to the immediate attention* of a user even if the principal output stream, the value of the* variable {@code out}, has been redirected to a file or other* destination that is typically not continuously monitored.* The encoding used in the conversion from characters to bytes is* equivalent to {@link Console#charset()} if the {@code Console}* exists, <a href="#stderr.encoding">stderr.encoding</a> otherwise.** @see Console#charset()* @see <a href="#stderr.encoding">stderr.encoding</a>*/public static final PrintStream err = null;......
}
来试图理解一下里面的流程:
System.in代表标准输入流,通常与键盘输入相关联。
System.out代表标准输出流,通常与控制台输出相关联。
程序启动之后,通过registerNatives()和设备进行关联。
我对这个设计的理解是,System.in
和System.out
是在程序启动时就已经准备好的,并且会在程序的整个生命周期中保持可用状态。当程序需要读取用户输入或向控制台输出内容时,会使用这两个标准流对象来进行交互操作。因此,它们的执行顺序可以看作是在程序执行期间随时可用。
不知道对不对?
问题来源:
java用scanner类从控制台读取输入怎么可以先读取再提示呢?_编程语言-CSDN问答