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

时间:2010-03-04 04:44:56

标签: java oop class

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

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);
    }
}

5 个答案:

答案 0 :(得分:57)

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

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

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

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

答案 1 :(得分:8)

要防止特定类被实例化,您应该添加一个私有的构造函数。这会阻止“任何其他”类创建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);
        }
    }

答案 2 :(得分:2)

我们应该将成员定义为静态

  1. 对于班级的所有对象都应该是通用的。
  2. 应属于该类,并可通过类名访问。
  3. 不需要类的对象来访问它们。
  4. 现在假设我们将外部类定义为静态,并假设我们允许这样做。这是为了任何目的还是为开发人员提供任何优势,还是会给开发人员和语言创建者带来歧义和复杂性?

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

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

      从上述观点来看,我们可以说Java创建者不允许外部类是静态的,因为没有必要使它成为静态的。允许外部类静态只会增加复杂性,模糊性和欺骗性。阅读Why An Outer Java Class Can’t Be Static

      的更多信息

答案 3 :(得分:1)

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

答案 4 :(得分:0)

在 Java 中,根据定义,静态适用于类的内部组件。 “X 是静态的”在 Java 中意味着“X 与定义它的类相关联,而不是与该类的任何实例相关联”。

“静态”一词的字面意思是“固定在内存中的一个位置”。类的每个实例共享一个静态变量或静态成员。因此使用“类变量”作为“静态变量”的同义词。这让您立即看到您不能将外部类定义为静态。

因此,您的类 Qwert 不能创建为静态的。除非它被归入外部类的一个组件,有效地使其成为内部类。