为了避免无法确定该调用的构造函数而需将main函数设为先于类的构造而执行,故将其声明为static
2011-08-20 15:19
253 查看
避免无法确定该调用的构造函数而需将main函数设为先于类的构造而执行,故将其声明为static。
前几天,曾同学问我为什么Java main函数带有static,我一时也不明白,只好说是Java的main函数的格式是规定的,我也一直这样写下来,然后赶紧去查。原谅我,我忘记这是在哪个网站/论坛找到的了,因为当时没记录,只有在聊天记录中找到了当时copy下来的我觉得可以说得过去的解释。
The
method is static because otherwise there would be ambiguity: which constructor should be called? Especially if your class looks like this:
1 2 3 4 5 | public class JavaClass{ protected JavaClass(int x){} public void main(String[] args){ } } |
the JVM call new JavaClass(int)? What should it pass for x?
If
not, should the JVM instantiate JavaClass without running any constructor method? I think it shouldn’t, because that will special-case your entire class – sometimes you have an instance that hasn’t been initialized, and you have to check for it in every method
that could be called.
There
are just too many edge cases and ambiguities for it to make sense for the JVM to have to instantiate a class before the entry point is called. That’s why main is static.
个人对以上的理解就是为了避免无法确定该调用的构造函数而需将main函数设为先于类的构造而执行,故将其声明为static。
如果没法调用main方法,又有谁能生成类实例呢?
在Java中,main()方法的声明为:public static void main(String args[])。必须这么定义,这是Java的规范。为什么要这么定义,和JVM的运行有关系。
当一个类中有main()方法,执行命令“java 类名”则会启动虚拟机执行该类中的main方法。
由于JVM在运行这个Java应用程序的时候,首先会调用main方法,调用时不实例化这个类的对象,而是通过类名直接调用因此需要是限制为public static。
对于java中的main方法,jvm有限制,不能有返回值,因此返回值类型为void。
main方法中还有一个输入参数,类型为String[],这个也是java的规范,main()方法中必须有一个入参,类细必须String[],至于字符串数组的名字,这个是可以自己设定的,根据习惯,这个字符串数组的名字一般和sun java规范范例中mian参数名保持一致,取名为args。
因此,main()方法定义必须是:“public static void main(String 字符串数组参数名[])”。
通俗而言,借用某笔者的话:
public, jvm对于类来说是外部调用,不用public的话没有权限去接触到main方法。static 是保证在class loading的时候就能够调用main方法了(使用class object)。如果不是static,那样就一定要生成类实例。但如果没法调用main方法,又有谁能生成类实例呢?
相关文章推荐
- 为了避免无法确定该调用的构造函数而需将main函数设为先于类的构造而执行,故将其声明为static
- java——构造函数、构造代码块、Static关键字、main函数 & 继承:子父类中的变量、函数的特点、抽象类、接口等
- static语句块、构造语句块(就是只有大括号的那块)以及构造函数的执行顺序
- java中main函数怎么调用外部非static方法
- static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法
- 避免构造/析构函数调用虚函数
- [转载]解决多线程中执行CreateHandle()时无法调用值Dispose()
- 编写高质量代码改善C#程序的157个建议——建议95:避免在构造方法中调用虚成员
- 声明一个父类A,它只有一个非默认构造方法;声明A的子类B,B具有默认构造方法及非默认方法,并在B的构造方法中调用基类A的构造方法。
- 当类中的方法全部都是 static 关键字修饰时 ,它的构造方法最好作为 private 私有化,理由是方法全是 static, 不知道的人会去new对象去调用,需要调用构造方法。 但 static的方法直接用类名调用就行!
- 执行 CreateHandle() 时无法调用值 Dispose()。
- Java静态变量 静态代码块 主函数 成员变量 构造代码块 构造函数的执行顺序
- static,构造函数,子类,父类执行顺序
- 编写高质量代码——避免在构造析构函数中调用虚函数
- Java中static成员变量、成员变量、static代码块、代码块、构造方法的执行顺序
- 静态语句块、构造语句块(也叫构造器)、非静态语块以及构造函数的执行顺序。
- 拷贝构造,构造函数,析构函数的调用顺序
- C++箴言:避免构造或析构函数中调用虚函数 zz
- java构造代码块,构造函数和普通函数的区别和调用时间
- JavaSE8基础 类中代码块与构造函数的执行顺序 静态代码块(only) -> 构造代码块 -> 构造方法