方法&变量调用问题

时间:2013-10-04 15:45:37

标签: java methods static

我刚刚写了这段简短的代码:

public class Check {
public static int gold, silver;
public int level=1;

public static void main(String[] args) {
    System.out.println("You are now level " + level + "!");
    String num1 = JOptionPane.showInputDialog("Enter a positive number:");
    int num2 = Integer.parseInt(num1);
    if (num2 < 0) {
        next();
    } else {
        main();
    }
}
public void next() {
    System.out.println("Thank you!");
}

}

我对此代码有3个问题:

  1. 如果我创建一个公共静态Integer变量,我在声明它时不能为它设置一个数字。我必须在声明时设置一个数字。编辑:我的不好,可以在声明时给它分配一个数字。

    如果我创建一个公共Integer变量,我可以声明它并为其设置一个数字,但由于某种原因,我不能在public static void Main中使用它,我也必须这样做。

  2. 由于next()不是静态void,我无法从main(String [] args)void调用它。 我不想让next()静态,因为那时我将无法使用非静态的公共整数。

  3. 我无法从main()本身返回(调用)main()。当检测到无效输入时,这是必要的。

  4. 我可以对这些问题做些什么?

4 个答案:

答案 0 :(得分:2)

如果您不想使用静态方法,则必须在main方法中创建一个类对象,并使用它来调用next()方法。

Check obj = new Check();
obj.next();

答案 1 :(得分:2)

  

如果我创建一个公共静态Integer变量,我在声明它时不能为它设置一个数字。

是的,你可以。

  

如果我创建一个公共Integer变量,我可以声明它并为其设置一个数字,但由于某种原因我不能在public static void Main中使用它

那是因为静态方法不能使用非静态属性。

  

我无法从main()本身返回(调用)main()。当检测到无效输入时,这是必要的。

是的,你可以,但你需要传递参数。

答案 2 :(得分:1)

  1. 你错了。
  2. 您无法访问静态方法中的非静态静态成员(main是静态的)。
  3. 您忘了参数
  4. 试试这个变种:

    public class Check {
        public static int gold, silver;
        public static int level = 1;
    
        public static void main( String[] args ) {
            System.out.println( "You are now level " + level + "!" );
            String num1 = JOptionPane.showInputDialog( "Enter a positive number:" );
            int num2 = Integer.parseInt( num1 );
            if( num2 < 0 ) {
                next();
            }
            else {
                main(args);
            }
        }
    
        public static void next( ) {
            System.out.println( "Thank you!" );
        }
    }
    

答案 3 :(得分:0)

几条评论。

1)如果我创建一个公共静态Integer变量,我在声明它时不能为它设置一个数字

<强>为什么吗

你应该很容易就这样声明:

public static int level = 1;

然后你的代码可以正常工作。

2)避免静态 - 不要从main调用程序逻辑,使用main来引导您的应用程序:

public int gold, silver;
public int level = 1;

public static void main(String[] args) {
    new Check().read();
}

public void read() {
    System.out.println("You are now level " + level + "!");
    String num1 = JOptionPane.showInputDialog("Enter a positive number:");
    int num2 = Integer.parseInt(num1);
    if (num2 < 0) {
        next();
    } else {
        read();
    }
}

public void next() {
    System.out.println("Thank you!");
}

因此,您将所有实例作为范围,然后在Check中创建main实例

我还会注意到你正在使用退出EDT的Swing GUI类来打破Swing的单线程模型,因此这段代码存在根本缺陷。