【问题标题】:Why do I have to add "static"为什么我必须添加“静态”
【发布时间】:2014-06-11 04:36:31
【问题描述】:

我遇到了静态问题,该程序无法编译。编译器说

Enums.java:27: non-static variable this cannot be referenced from a static context
        SexEnum a = new SexEnum(Sex.MALE);
                    ^
Enums.java:28: non-static variable this cannot be referenced from a static context
        SexEnum b = new SexEnum(Sex.FEMALE);

但是,如果我在下一行添加一个“静态”关键字,一切都会好起来的。

public static class SexEnum{

/////////////////////////////////////// /////////////////////////////////////////p>

public class Enums{
        enum Sex{MALE, FEMALE};

        public class SexEnum{          // something wrong this line
            private Sex sex;

            public SexEnum(Sex sex){
                this.sex = sex;

            }
            public void info(){
                Sex s = this.sex;
                switch(s){
                    case MALE:
                        System.out.println("I'm a male.");
                        break;
                    case FEMALE:    
                        System.out.println("I'm a female.");
                        break;
                    default:
                        System.out.println("I'm not a human.");
                        break;
                }
            }
        }
        public static void main(String[] argv){
            SexEnum a = new SexEnum(Sex.MALE);
            SexEnum b = new SexEnum(Sex.FEMALE);
            a.info();
            b.info();
        }
    }

谁能给我解释一下?谢谢。

【问题讨论】:

  • 这与enum 的要求以及您声明的类是内部类这一事实有关 - 看看Why can't I create an enum in an inner class in Java? 这可能是一个重复的问题
  • @MadProgrammer 这是一条完全不同的错误消息,但枚举并没有立即与问题相关。
  • 您不必“必须添加静态”。有几种解决方案:这是其中之一。您需要查看 this answer 以获得正确的枚举值。
  • @user2864740 你可能是对的,没有注意到 OP 正在创建一个 enum
  • @EJP 感谢您的指点。

标签: java class oop static enums


【解决方案1】:

我认为您可以通过将 info 方法滚动到 enum 中而不是创建包装类来消除所有问题:

public class Enums{
    public enum Sex {
        MALE, FEMALE;

        public void info(){
            System.out.printf("I'm a %s.%n", this.toString().toLowerCase());
        }
    }

    public static void main(String[] argv){
        Sex a = Sex.MALE;
        Sex b = Sex.FEMALE;
        a.info();
        b.info();
    }
}

Java 枚举也是类,因此您可以添加方法、字段等。

【讨论】:

    【解决方案2】:

    问题是你试图实例化一个内部类,你只能从上层类的实例化对象中做到这一点。 但是如果类是静态的,它不依赖于上层类,任何其他对象都可以实例化它。

    【讨论】:

      猜你喜欢
      • 2015-02-04
      • 2014-05-27
      • 1970-01-01
      • 1970-01-01
      • 2017-08-23
      • 2012-04-11
      • 1970-01-01
      • 2011-06-30
      • 1970-01-01
      相关资源
      最近更新 更多