如果我将一个scanner对象传递给一个方法,scanner将从输入的开始处扫描还是继续扫描输入的剩余部分。
public class Test {
public void test(Scanner sc) {
System.out.println(sc.nextLine());
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
System.out.println(str);
Test t = new Test(sc);
t.test();
}
}
// here is the input file:
1 2 3 4
5 6 7 8
9 1 2 3
我已经在Windows和Linux上测试了这段代码,但是得到了两个不同的结果
第一个结果在方法测试中,打印为5 6 7 8
第二个结果很难理解,它打印了1234,仍然是输入的第一行。
这是否与Java的不同版本有关,有人能为我解释一下吗,谢谢!
3条答案
按热度按时间slwdgvem1#
在两个方法中,scanner是同一个对象--你传递的是对同一个scanner的引用,所以,它不知道它是从程序中的一个新位置被使用的--如果调用了相同的方法,不管什么代码在使用它,它都会忠实地做同样的事情。
vq8itlhq2#
首先,你的代码中有一个错误〉〉Test t = new Test(sc),它使用了参数化的构造函数,但是我没有看到任何构造函数。
在Java中,对象是通过Ref(对象堆地址的引用)传递的,而不是通过值传递的(如在基元类型中)。这就是为什么将对象传递给函数不会改变对象的原因。对象保持不变。
你好拉维
shstlldc3#
我觉得你的问题必须解决。
对于不同的操作系统,新行的定义方式不同。如果打印
您将看到该属性的值在Windows和Linux中是不同的。
我不知道你在哪里写的输入文件,但它可能包含一个操作系统特定的行分隔符。当你运行你的程序在另一个操作系统,你会结束,但不同的结果。
我建议您像这样定义扫描仪文件的分隔符
如果我没记错的话,\n代表linux新行,而**\r\n**代表windows新行。