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

gmh*_*mhk 24 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Kev*_*ner 58

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

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

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

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

  • 相当多的现货.默认情况下,内部类不是静态的,也就是说,具有嵌套类的类的每个实例都获得自己的嵌套类副本.这就是你如何在类中引用"this",以及为什么你不能声明静态方法或字段,没有任何意义,因为外部类的每个实例都有自己的副本."静态"嵌套类(根据定义是一个真正的"内部"类)意味着该类只有一个副本,它更像是一个普通类.我一直认为这些嵌套类的语义无可救药. (3认同)

edw*_*att 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);
        }
    }
Run Code Online (Sandbox Code Playgroud)