(对于初学者Java类)赋值指定我只生成一个Scanner实例,并且我需要在多个方法中使用它,所以我在main之外声明了它。我声明了一个数组,并试图将其等同于方法调用initialCash(),就像在Python中一样。问题是,如果我使initialCash方法静态,我就不能使用Scanner。如果initialCash()不是静态的,Eclipse会善意地告诉我它"不能对非静态方法进行静态引用";行)我该如何解决这个问题?
package proj1;
import java.util.Scanner;
public class Project1
{
Scanner scanner = new Scanner(System.in);
public static void main(String[] args)
{
int[] money = new int[4];
money = initialCash();
}
public int[] initialCash()
{
int[] initialMoney = new int[4];
while(true)
{
System.out.print("Ones: ");
initialMoney[0] = scanner.nextInt();
System.out.print("Fives: ");
initialMoney[1] = scanner.nextInt();
System.out.print("Tens: ");
initialMoney[2] = scanner.nextInt();
System.out.print("Twenties: ");
initialMoney[3] = scanner.nextInt();
if((initialMoney[0]>=0)&&(initialMoney[1]>=0)&&(initialMoney[2]>=0)&&(initialMoney[3]>0))
{
return initialMoney;
}
else
{
System.out.println("One or more invalid denominations. Try again.");
}
}
}
}
创建一个类的实例,并从main调用该实例上的initialCash。
money = new Project1().initialCash();
PermGenError所说的肯定有效,或者您可以将initalCash()方法和scanner引用变量都设置为静态。
在您的代码中,行
Scanner scanner = new Scanner(System.in);
每次创建类型为Project1
的对象时,都会创建一个新的Scanner
对象。而如果你把它写成
static Scanner scanner = new Scanner(System.in);
它将创建一个Scanner
实例,供引用该对象的所有类使用。在你提到的问题中,必须只有一个扫描仪对象,如果是这样的话,这就是方法。
如果您使用
money = new Project1().initialCash();
您正在创建一个新的Project1
对象和一个新Scanner对象,如果您要通过调用另一个函数来重用Scanner
对象,因为它与Project1
的特定实例绑定,所以我建议您将其设为static
,与initialCash
函数相同,它与该对象实例绑定。
使Scanner和initialMoney方法保持静态。这应该可以解决你的问题。
static Scanner scanner = new Scanner(System.in);
public static void main(String[] args)
{
int[] money = new int[4];
money = initialCash();
}
public static int[] initialCash()
{
int[] initialMoney = new int[4];
while(true)
{
System.out.print("Ones: ");
initialMoney[0] = scanner.nextInt();
System.out.print("Fives: ");
initialMoney[1] = scanner.nextInt();
System.out.print("Tens: ");
initialMoney[2] = scanner.nextInt();
System.out.print("Twenties: ");
initialMoney[3] = scanner.nextInt();
if((initialMoney[0]>=0)&&(initialMoney[1]>=0)&&(initialMoney[2]>=0)&&(initialMoney[3]>0))
{
return initialMoney;
}
else
{
System.out.println("One or more invalid denominations. Try again.");
}
}
}