2

此代码有错误

public class DoIt {
    public static void main(String[] args) {
        final class Apple {
            public static String place = "doIt";
        }
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Constants.place);
            }
        });
        thread.start();
    }
}

错误-The field name cannot be declared static in a non-static inner type, unless initialized with a constant expression

4

5 回答 5

6

问题是该字段是非最终的:在非静态内部类的上下文中,只允许最终字段是静态的:

final class Apple {
    // This should compile
    public static final String place = "doIt";
}
于 2013-09-06T10:46:44.820 回答
1

JLS 8.1.3

内部类不能声明静态成员,除非它们是常量变量(第 4.12.4 节),或者发生编译时错误。

final class Apple {
    public static final String place = "doIt"; // This is good
}

内部类是实例类。使用静态成员的要点是直接调用它而不必实例化。因此,在内部类中允许静态成员没有多大意义。但是,您可以将它们声明为静态 -

static final class Apple {
    public static String place = "doIt";
}
于 2013-09-06T10:56:10.417 回答
0

根据Java教程

本地类可以具有静态成员,前提是它们是常量变量。

所以你必须宣布它是最终的:

    public static void main(String[] args) {
    final class Apple {
        public static final String place = "doIt";
    }
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("");
        }
    });
    thread.start();
}
于 2013-09-06T10:53:29.663 回答
0
 final class Apple { {  
     // you can't define non final field inside the final class
     // you have to use final with static

 }

您可以使用

   public  final static String place = "doIt";
于 2013-09-06T10:46:26.903 回答
0

在我推理出错误术语之前,如下所示

术语:嵌套类分为两类:静态和非静态。声明为静态的嵌套类简称为静态嵌套类。非静态嵌套类称为内部类(更具体地说是本地内部类)。

现在,在您的情况下,您有本地内部类。根据文档 Because an inner class is associated with an instance, it cannot define any static members itself.

作为内部类实例的对象存在于外部类的实例中,并且在加载类时加载静态成员,而在您的情况下,您无法在加载类时访问Apple类以加载 place变量。

本地类也可以具有静态成员,前提是它们是常量变量。

所以你可以做public static final String place = "doIt";

于 2013-09-06T10:59:55.687 回答