【问题标题】:Beginner Java static scope error初学者Java静态范围错误
【发布时间】:2013-02-08 14:09:51
【问题描述】:

(对于初学者 Java 类) 该分配指定我只创建一个 Scanner 实例,并且我需要在多个方法中使用它,因此我在 main 之外声明了它。我声明了一个数组并尝试将其与方法调用 initialCash() 等同起来,就像我在 Python 中所做的那样。问题是如果我将 initialCash 方法设为静态,我就不能使用 Scanner。如果 initialCash() 不是静态的,Eclipse 会告诉我它“不能对非静态方法进行静态引用”。 (in the 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.");
            }
        }

    }


}

【问题讨论】:

    标签: java static scope


    【解决方案1】:

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

    money = new Project1().initialCash();
    

    【讨论】:

    • @BrianRoach 没有问题。我的每日 200 次代表已经超过了。没关系..呵呵..谢谢你.. :)
    • 非常感谢,我显然还在适应整个面向对象的东西
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      在您的代码中,行

      Scanner scanner = new Scanner(System.in);

      每次创建Project1 类型的对象时都会创建一个新的Scanner 对象。而如果你把它写成

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

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

      如果你使用

      money = new Project1().initialCash();

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2014-05-11
          • 1970-01-01
          • 1970-01-01
          • 2017-01-18
          • 1970-01-01
          • 2012-01-02
          • 1970-01-01
          • 2012-12-09
          • 2016-03-08
          相关资源
          最近更新 更多