初学者Java静态范围错误

时间:2013-02-22 20:51:43

标签: java static scope

(适用于初学Java类) 赋值指定我只生成一个Scanner实例,并且我需要多个方法,所以我在main之外声明它。我声明了一个数组,并尝试将它与方法调用,initialCash()等同,就像在Python中一样。问题是如果我使initialCash方法静态,我不能使用扫描仪。如果initialCash()不是静态的,那么Eclipse很友好地告诉我它“无法对非静态方法进行静态引用”。 (在money = initialCash();行)  我该如何解决这个问题?

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.");
            }
        }

    }


}

4 个答案:

答案 0 :(得分:3)

创建一个类的实例,并从main调用该实例上的initialCash。

money = new Project1().initialCash();

答案 1 :(得分:0)

PermGenError所说的肯定会有效,或者你可以将initalCash()方法和扫描仪引用变量都设置为静态。

答案 2 :(得分:0)

在您的代码中,行

Scanner scanner = new Scanner(System.in);

每次创建类型为Scanner的对象时,

都会创建一个新的Project1对象。如果你把它写成

static Scanner scanner = new Scanner(System.in);

它将创建一个Scanner实例,供所有引用此对象的类使用。在您提出的问题中,您必须提到一个Scanner对象,如果是这样,这就是要走的路。

如果您使用

money = new Project1().initialCash();

您正在创建一个新的Project1对象以及一个新的Scanner对象,如果您通过调用另一个函数来重用Scanner对象,因为它与{的特定实例相关联{1}},所以我建议您将其设为Project1,与static函数相同,它与该对象实例相关联。

答案 3 :(得分:0)

使Scanner和initialMoney方法保持静态。这应该可以解决您的问题。

let countryObj = {
    Argentina: 'buenos Aires',
    Bolivia: 'Sucre',
    Brazil: 'Brasilia',
    Chile: 'Santiago',
    Columbia: 'Bogotá',
    Ecuador: 'Quito',
    Guyana: 'Georgetown',
    Paraguay: 'Asunción',
    Peru: 'Lima',
    Suriname: 'Paramaribo',
    Uruguay: 'Montevideo',
    Venezuela: 'Caracas'
} 

let keys = Object.keys(countryObj); // returns an array of the keys (country names) in countryObj


let randomCountry =  function() {
    // returns a randomly chosen country from the keys array and writes
    // ... the country to the <p> element in index.html    
    let currentCountry = keys[Math.floor(keys.length * Math.random())];
    document.getElementById('p').innerHTML = currentCountry;
    return currentCountry;
}

let currentCountry = randomCountry();

console.log(countryObj[currentCountry]);