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


当前回答

只有嵌套类可以是静态的。通过这样做,您可以使用嵌套类而无需外部类的实例。

class OuterClass {
    public static class StaticNestedClass {
    }

    public class InnerClass {
    }

    public InnerClass getAnInnerClass() {
        return new InnerClass();
    }

    //This method doesn't work
    public static InnerClass getAnInnerClassStatically() {
        return new InnerClass();
    }
}

class OtherClass {
    //Use of a static nested class:
    private OuterClass.StaticNestedClass staticNestedClass = new OuterClass.StaticNestedClass();

    //Doesn't work
    private OuterClass.InnerClass innerClass = new OuterClass.InnerClass();

    //Use of an inner class:
    private OuterClass outerclass= new OuterClass();
    private OuterClass.InnerClass innerClass2 = outerclass.getAnInnerClass();
    private OuterClass.InnerClass innerClass3 = outerclass.new InnerClass();
}

来源:

关于嵌套类的Oracle教程

关于同一话题:

Java:静态与非静态内部类 Java内部类和静态嵌套类

其他回答

您可以在Eclipse中的PlatformUI中查看带有静态方法和私有构造函数的类,该类本身是final的。

public final class <class name>
{
   //static constants
   //static memebers
}

如上所述,一个类不能是静态的,除非它是另一个类的成员。

如果你想要设计一个“不能有多个实例”的类,你可能想要研究一下“单例”设计模式。

这里是初学者单例信息。

警告:

如果您正在考虑使用 单例模式,抵制与所有 你的可能。这是最简单的方法之一 设计模式来理解,可能 最受欢迎的,绝对是 大多数滥用。 (来源:JavaRanch,如上图所示)

当然可以,但只能是内部嵌套类。在这里,它意味着嵌套类的实例不需要外部类的封闭实例。

但是对于顶级类,语言设计者想不出任何有用的关键字,所以它是不允许的。

public class Outer {
   public static class Inner {}
}

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

来自JLS:

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

在这里:

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

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

所以,我来晚了,但这是我的两种观点——哲学上补充科林·赫伯特的答案。

在高层次上,你的问题涉及对象和类型之间的区别。虽然有很多Car(对象),但只有一个Car类(类型)。将某些内容声明为静态意味着您在“类型”空间中操作。只有一个。顶级类关键字已经在“type”空间中定义了一个类型。因此,“公共静态类Car”是多余的。