题目:参照本章的HelloDate.java这个例子,创建一个“hello,word”程序,该程序只要输出这句话即可。你所编写的类里只需一个方法(即main方法,在程序启动时被执行)。记住要把它设置为static形式,并指定参数列表即使根本不会用到这个列表。用javac进行编译,再用java运行它。如果你使用的是不同于jdk的开发环境,请了解如何在你的环境中进行编译和运行。
这道题对于稍微有点Java基础的人来说都是非常简单的,代码如下
public class test {
public static void main(String[] args) {
System.out.println("hello,word");
}
}
不过仅仅如此,做题的意义不大,我们尝试着探究一下里面隐藏的深层次的内容。
pulic 表示该方法时对外公开的,为什么要对外公开呢?改成private行不行。
尝试后得知,不行,因为改成private后编译器里的run按钮不见了。为什么?暂时不知道,看下面。
其次,理解一下static
static是Java关键字,(java一共53个关键字加两个保留字,详情自寻资料)static应用于以下两种场景:
一,只想为某特定域分配单一存储空间,而不去考虑究竟要创建多少对象,甚至根本就不创建对象。
二,希望某个方法不与包含它的类的任何对象关联在一起。也就是说,即使没有创建对象,也能调用这个方法。
简单理解一下字面上的意思,用static声明的事物在存储上,也就是在内存空间上,是唯一的,要使用static不需要创建包含声明static的那个类,直接引用即可。
但是放到这个程序中,似乎有些莫名其妙啊,这里为什么要用static,把它拿掉行不行。
尝试拿掉static,编译器没有提示错误。似乎真的没有问题,运行一下试试!
但是,run按钮呢,(笔者使用的是itellij编译器)run按钮又不见了,编译器运行的机会都不给你。
static重新添加上去后,run又出现了。
看来static是至关重要的!但是为什么呢?似乎想不出答案,那就跳过,看下一个。
void很好理解,表面这个方法返回空。
但不用void行不行,用string并且在方法最后return一个“hello”行不行?
经过尝试,run又不见了,看来还是不行。也不知道原因,继续下一个。
接下来,理解一下main
我们注意到,在编译器上打main的时候,编译器并没有提示,main也没有变色,查资料可得,main不是关键字,也不是保留字。那我们这里不用main,用其他字母可以吗?比如用center,用start。
在编译器上尝试了一下后显然是不行的,编译器提示“method xxx is never used”,这意味着,只有用main的时候才会被use。
thinking in java书里提到main的不多,仅说了在创建一个独立运行的程序时,那个类必须包含一个名为main的方法,至于为什么没有解释。那我们就网上搜一下资料。
网上关于main的博客很多,总结来说,有以下几条:
main是java应用程序的入口,java程序在运行时,首先执行的是main方法。
main是由jvm(java虚拟机)调用的。
这里再结合上面的static的用途,就很好理解了,因为main是入口,是第一个执行的,要是它与定义在哪个类有关,那限制太大了,所以加了static,当我们去掉static关键字时,jvm虚拟机显然就找不到main了,自然就无法运行。
至于main方法里的参数string[]args,是用来接受命令行输入,比如我们要做计算两个数的和,这两个数事先没有子啊程序中定义好,而是要在命令行中输入,输入的位置就是args。
综合以上,可以简单理解一下main方法为什么这样写。
首先,public的原因是因为jvm要调用它,并且是第一个调用它,若是改成其他如private,jvm就找不到程序,无法运行。
其次,要用static是因为main方法作为程序入口,不应该受类的限制,且程序的入口只有一个,不能有多个,所以要用static。
void是因为main方法是第一个被调用的,是最底层的,除了jvm,没有其他方法调用void,自然不需要返回值。
而main,不是关键字我们可以理解为一个程序只有一个main,不需要将main置为关键字,同时main只能这样写,否则jvm就不认识它了。
看来public static void main(String[] args)是不能有任何修改的规定的写法。
以上就是对该题目的简单扩展。
不过,笔者还有一个小小的疑问。
在分析过程中我们不难发现,static的两种特性和main的需求刚好完美的相匹配。笔者想问,是先有static关键字,发现它很适用于main,然后应用上,还是先有main,为了main的几个特性,创造出static关键字。
该问题仅供娱乐。