静态非静态参考混淆

时间:2014-07-07 05:30:08

标签: java

更新:我根据我得到的一些答案进行了一些更改并且有效。 正确的代码是 -

public class Tsett {
        static HashSet<String> names=new HashSet<String>();
        static String name="";
        public static void main(String[] args) {
        Scanner input=new Scanner(System.in);

        while(2>1){

    String s=input.next();
    char choice=s.charAt(0);

    switch(choice){
    case '1': addname(); break;
    case '2': removename(); break;
    case '3': displayname(); break;
    case '4': System.exit(0); break;
    default:System.out.println("Invalid Choice Entered.");
    }
        }



}
public static void addname(){
Scanner b=new Scanner(System.in);       
System.out.println("Enter a name to be added.");
name=b.next();
names.add(name);    
}
public static void removename(){
    Scanner b=new Scanner(System.in);   
    System.out.println("Enter a name to be remove.");
    name=b.next();
    names.remove(name);
}

public static void displayname(){
System.out.println("The names are as follows-");
for(String newname:names)
    System.out.println(newname);
    }

}

使用关键字'static'解决了这个问题。

我在'names'上为我的菜单驱动程序编写了以下代码。

package tut4;

import java.util.HashSet;
import java.util.Scanner;

public class Tsett {

    HashSet<String> names = new HashSet<String>();

    public static void main(String[] args) {

        while (2 > 1) {

            Scanner input = new Scanner(System.in);
            String s = input.next();
            char choice = s.charAt(0);

            switch (choice) {
                case '1':
                    addname();
                    break;
                case '2':
                    removename();
                    break;
                case '3':
                    displayname();
                    break;
                case '4':
                    System.exit(0);
                    break;
                default:
                    System.out.println("Invalid Choice Entered.");
            }
        }

    }

    public static void addname() {
        String name = "";
        Scanner b = new Scanner(System.in);
        System.out.println("Enter a name to be added.");
        name = b.next();
        names.add(name);
    }

    public static void removename() {
        String name = "";
        Scanner b = new Scanner(System.in);
        System.out.println("Enter a name to be remove.");
        name = b.next();
        names.remove(name);
    }

    public static void displayname() {
        System.out.println("The names are as follows-");
        for (String newname : names) {
            System.out.println(newname);
        }
    }

}

出现的问题是

  

无法对非静态字段“名称”进行静态引用

addname()removename()displayname()个函数中。

任何人都可以向我解释为什么会出现这种错误以及如何修复它?

5 个答案:

答案 0 :(得分:4)

习惯不依赖static引用。他们有地方和用途,但许多人变得依赖他们。您还应该习惯使用main方法仅将程序初始化为可以将操作切换到应用程序的主/核类的状态。

相反,我会在你的方法上删除你static修饰符并创建一个可以&#34;运行&#34;你班级的核心逻辑。

main方法中,我将创建Tsett类的实例并调用此方法。这样您就可以访问实例字段names和方法

答案 1 :(得分:2)

names的声明更改为

static HashSet<String> names = new HashSet<String>();

因为这些方法是静态的,所以它们引用的变量也必须是静态的 这是因为非静态变量必须存在于特定实例中,并且实例之间可以不同,而静态方法则不能。如果要求他们引用非静态变量,则无法知道要使用的类的哪个实例。

答案 2 :(得分:2)

您应该创建这些方法所在类的实例。

String names;
Class class = new Class();  //Creating Instance of "Class" called "class".
names = class.addname(); //Access a method in "Class" using instance name "class" then method name and assign the value it returns to "names".

使用想要显示的名称

  Switch(choice){
    case '1': names; break;

答案 3 :(得分:1)

要解决您的问题,您需要输入字段&#39;名称&#39;静态的。您获得的错误是尝试在静态上下文中调用非静态字段的结果。

尝试

private static HashSet<String> names = new HashSet<String>();

这将解决您的问题。

答案 4 :(得分:0)

嗯,这里有一些建议(你在上次评论中提到了这些建议......)

  1. while (2 > 1)更改为while(true)
  2. Scanner input = new Scanner(System.in);放在班级。

  3. 放置声明:  String s = input.next();  char choice = s.charAt(0);  在循环之外。

  4. 在所有方法中都不需要Scanner b = new Scanner(System.in);