为什么在Java中不能将类声明为静态?


当前回答

public class Outer {
   public static class Inner {}
}

... 它可以被声明为静态的——只要它是一个成员类。

来自JLS:

成员类可以是静态的,在这种情况下,它们不能访问周围类的实例变量;或者它们可能是内部类(§8.1.3)。

在这里:

static关键字可以在非内部类t的主体中修改成员类型C的声明。它的作用是声明C不是内部类。就像T的静态方法在其主体中没有T的当前实例一样,C也没有T的当前实例,也没有任何词汇上的封装实例。

静态关键字对于顶级类没有任何意义,因为顶级类没有外围类型。

其他回答

我们在java中编写的所有代码都包含在一个类中。每当我们运行一个类时,JVM都会实例化一个对象。JVM可以创建许多对象,根据定义,静态意味着对所有对象都有相同的复制集。

所以,如果Java允许顶级类是静态的,无论何时你运行一个程序,它都会创建一个对象,并保持在相同的内存位置上重写。

如果你只是在每次运行时替换对象,那么创建它有什么意义呢?

这就是Java摆脱顶级类静态的原因。

可能有更具体的原因,但这对我来说更合乎逻辑。

具有私有构造函数的类是静态的。

像这样声明你的类:

public class eOAuth {

    private eOAuth(){}

    public final static int    ECodeOauthInvalidGrant = 0x1;
    public final static int    ECodeOauthUnknown       = 0x10;
    public static GetSomeStuff(){}

}

你可以在不初始化的情况下使用:

if (value == eOAuth.ECodeOauthInvalidGrant)
    eOAuth.GetSomeStuff();
...

我认为这可能就像喝一杯咖啡一样简单! 看看这个。 定义类时不显式使用static关键字。

public class StaticClass {

    static private int me = 3;
    public static void printHelloWorld() {
       System.out.println("Hello World");
    }



    public static void main(String[] args) {
        StaticClass.printHelloWorld();
        System.out.println(StaticClass.me);
    }
}

这不是静态类的定义吗? 我们只使用绑定到类的函数。 注意,在这种情况下,我们可以在该嵌套中使用另一个类。 看看这个:

class StaticClass1 {

    public static int yum = 4;

    static void  printHowAreYou() {
        System.out.println("How are you?");
    }
}

public class StaticClass {

    static int me = 3; 
    public static void printHelloWorld() {
       System.out.println("Hello World");
       StaticClass1.printHowAreYou();
       System.out.println(StaticClass1.yum);
    }



    public static void main(String[] args) {
        StaticClass.printHelloWorld();
        System.out.println(StaticClass.me);
    }
}

唯一可以是静态的类是内部类。下面的代码工作得很好:

public class whatever {
    static class innerclass {
    }
}

静态内部类的意义在于它们没有外部类对象的引用。

默认情况下,顶级类是静态的。默认情况下,内部类是非静态的。您可以通过显式地将内部类标记为静态来更改它们的默认值。顶级类由于是顶级类,所以不能具有非静态语义,因为没有父类可以引用。因此,无法更改顶级类的默认值。