非静态变量,这不能从静态上下文引用 - 为什么在这里?

use*_*230 6 java static compiler-errors

我有一个代码:

package why;

public class Foo
{
    public class Foo1
    {
        String bar;

        public Foo1(String bar)
        {
            this.bar = bar;
        }

        public static Foo1 MYCONSTANT = new Foo(null);
    }

}
Run Code Online (Sandbox Code Playgroud)

为什么我得到'非静态变量,这不能从静态上下文引用'?我分配了非静态类的实例.

为什么在这里?

public static Foo getMYCONSTANT()
{
    return new Foo(null, null);
}
Run Code Online (Sandbox Code Playgroud)

谢谢

Liv*_* T. 6

让我们来看看这个例子:

public class MainClass {

  public class NonStaticClass {

    public static NonStaticClass nonStatic = new NonStaticClass();
    //Compile error: The field nonStatic cannot be declared static; 
    //static fields can only be declared in static or top level types
    public static int i = 10;//this field also causes the same compile error
  }

}
Run Code Online (Sandbox Code Playgroud)

问题是NonStaticClass,嗯,不是静态的.非静态内部类不能包含静态字段.

如果你想在内部类中有一个静态字段,你需要使类静态.

从java文档:

内在的类

与实例方法和变量一样,内部类与其封闭类的实例相关联,并且可以直接访问该对象的方法和字段.此外,由于内部类与实例相关联,因此无法定义任何静态成员本身.

有关更多信息,请查看嵌套类


pau*_*sm4 1

我不确定你真正的问题是什么......但这也许会有所帮助:

http://en.wikipedia.org/wiki/Singleton_pattern

Joshua Bloch 在他的《Effective Java》一书的第二版中声称,对于任何支持枚举的 Java,“单元素枚举类型是实现单例的最佳方式”[9]。枚举的使用非常容易实现,并且对于可序列化对象没有任何缺点,必须通过其他方式来规避。

public enum Singleton {
        INSTANCE;
}
Run Code Online (Sandbox Code Playgroud)