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

我试图找到为什么不能将类创建为静态? 喜欢:

public static class Qwert{ public static void main(String args[]){ int x = 12; while(x<12){ x--; } System.out.println(" the X value is : "+ x); } } 

在Java中, static关键字通常将一个方法或字段标记为每个类的实例不存在一次,但是曾经一次。 一个类无论如何都存在,所以实际上,所有类都是以这种方式“静态”的,所有对象都是类的实例。

static内部类有意义,这是完全不同的:通常内部类实例可以访问它所绑定的外部类实例的成员,但如果内部类是static ,它没有这样的引用,并且可以在没有外部类的实例的情况下进行实例化。 也许你看到了某个地方,然后尝试在顶级类中使用它,它没有意义。

或许你在其他语言中看到它,比如C#,它的语法非常像Java。

(有一次我无法弄清楚为什么外部类实例没有被垃圾收集 – 这是因为我在其他地方保留了对其内部类实例之一的引用,而内部类不是static ,所以有对外部类实例的引用。所以默认情况下,我现在将内部类设为static 。)

要防止特定类被实例化,您应该添加一个私有的构造函数。 这会阻止“任何其他”类创建Qwert类型的对象。

例如:

  public static class Qwert{ private Qwert() {} public static void main(String args[]){ int x = 12; while(x<12){ x--; } System.out.println(" the X value is : "+ x); } } 

我们应该将成员定义为static

  1. 对于class级的所有对象应该是通用的。
  2. 应该属于类并且可以通过类名访问。
  3. 不应该需要类的对象来访问它们。

现在假设我们将外部类定义为静态,并假设我们可以这样做。 这是出于任何目的还是为开发人员提供任何优势,还是会给开发人员和语言创建者带来歧义和复杂性?

让我们检查一下,将外部类定义为静态将用于我们上面定义的目的吗?

  1. 每个类对于它的所有对象都是通用的,并且不需要使其静态以使其可用于所有对象。
  2. 我们需要一个类名来访问它的静态成员,因为这些成员是类的一部分,而外部类是包的一部分,我们可以通过编写package_name.class_name(类似于class_name.static_field_name)直接访问该类,所以再次有默认情况下不需要做任何已经存在的事情。
  3. 如果它是可见的,我们不需要任何对象来访问它,我们可以简单地编写package_name.class_name来访问它。 根据定义,类是其对象的蓝图,我们创建一个类来从中创建对象(exception将始终存在,例如java.lang.Math),同样不需要将外部类定义为静态。

从上面的观点来看,我们可以说Java创建者不允许外部类是静态的,因为没有必要使它成为静态的。 允许使外部类静态只会增加复杂性,模糊性和欺骗性。 阅读更多关于为什么外部Java类不能是静态的

为了防止任何类通过inheritance或使用reflection来创建Qwert的实例,通过放置一个毒丸使构造函数失败:

 public class Qwert { private Qwert() throws IllegalAccessException { throw new IllegalAccessException("Utility class!"); } public static class Yuiop { public Yuiop() throws IllegalAccessException { // generates a synthetic accessor method to super() } } public static void main(String args[]) { new Yuiop(); } } 

因为当我们为组件使用static关键字时,该组件成为类级组件,其内存由其类获取。