1
2
3
4
|
public
static
void
main(String[ ] arg){
doSomething();
}
|
这个方法是所有java程序员再熟悉不过的方法了,但这个方法又是最特殊的方法,它的名字必须是main,它的参数必须是一个字符串数组,它的类型必须是public static void,这么多必须让初学者对其充满充满了疑问却又无可奈何,现在让我们一点点的来分析一下main方法!
1. 关键字public
public是一个访问权限修饰符,与public相对应的还有protected、默认(没有任何权限修饰符)、private,四种修饰符如其名称所示,分别对应公有、受保护、缺省、私有四种访问级别。外部类仅能处于公有与缺省级别,而内部类、变量、方法可根据需要处于四种级别中任意一种。四种修饰符修饰的类、变量与方法的可见性如下表所示:
访问级别 | 同类 | 同包 | 子类 | 其他地方 |
公有 | 可访问 | 可访问 | 可访问 | 可访问 |
受保护 | 可访问 | 可访问 | 可访问 | |
缺省 | 可访问 | 可访问 | | |
私有 | 可访问 | | | |
注:空白处均为不可访问
2. 关键字static
通常我们想要使用某个类的属性或方法时,我们需要创建一个类的对象,并用new为该类分配数据空间。但当我们需要让所有对象共用一个属性时,或让某个属性/方法不与包含它的类的任何对象关联在一起,能在没有创建对象时直接调用时,这种方法显然不再适用,而static关键字却很好的解决了这一问题。让我们来看一段小程序
1
2
3
4
5
6
|
public
class
Test{
public
static
String s=
"这是一个静态变量"
;
public
static
void
output(){
System.out.println(s);
}
}
|
接着我们在mian方法中执行
1
2
3
4
5
6
7
8
9
|
Test.s=
"静态变量被初始化了"
;
Test.output();
System.out.println(
"*************"
);
Test f01=
new
Test();
Test f02=
new
Test();
f01.s=
"第一次改变静态变量"
;
f01.output();
f02.s=
"第二次改变静态变量"
;
System.out.println(f01.s);
|
程序运行后得到输出:
1
2
3
4
|
静态变量被初始化了
*************
第一次改变静态变量
第二次改变静态变量
|
从这段程序中可以看见,调用静态方法或变量有两种方法:
第一种:通过类名与点运算符调用;
第二种:通过对象与点运算符调用。
但推荐使用第一种方法,它强调了静态变量与方法的静态性。另外对象f02对s作了修改,可以看见f01.s值也发生了改变,这对普通变量是不可理喻的,但在这里,静态变量只有一份存储空间,在加载类的过程完成静态变量的内存分配,因此任何一个对象对静态变量的修改,都可以反应到其他对象中。
基于静态方法可在没有创建对象时直接调用的特殊性,对其也有一些限制:
a. 静态方法不能调用非静态属性或方法
b. 静态方法中不能引用this 、super关键字
3. 关键字void
void修饰方法时,该方法的没有返回值,注意:没有返回值与返回值为空(return null)是不同的两个概念,返回值为空它有返回值,并且返回值为null。
4. String[ ] arg
这是一个简单的字符串数组的定义,可根据自己的习惯写为String[ ] arg或String arg[ ],其中arg为自己写的数组名。
洋洋洒洒说了这么多,大家对main方法格式中出现的关键字应该都有了大致了解,现在我们回到main方法上来看看为什么是public static void main(String[ ] arg)。
首先,main方法是JVM(java虚拟机)自动调用,JVM调用main方法的位置自然不会在某个类中、或某个包中,因此只有当main方法在公有级别上时,才对JVM可见,所以mian方法需要public修饰,同理,main方法所在的类也需要public修饰符。由于main方法是所有程序的入口,也就是main被调用时没有任何对象创建,不通过对象调用某一方法,只有将该方法定义为静态方法,所以main方法是一个静态方法,既需要static修饰。JVM对于java程序已经是最底层,由它调用的方法的返回值已经没有任何地方可去,因此,main方法返回值为空,既需用void修饰。至于main方法的参数String[ ] arg我们现在已经很少有机会去用它了,它用于在接受命令行传入的参数,试一下面的小程序吧:
1
2
3
4
5
6
7
8
|
public
class
Test{
public
static
void
main(String[] arg){
System.out.println(
"输出在命令行接受的参数"
);
for
(
int
i=
0
;i<arg.length;i++){
System.out.println(arg[i]);
}
}
}
|
将其保存为Test.java文件,然后在命令行转到该文件目录,并输入:
1
2
|
javac Test.java
java Test 1st 2nd
|
运行结果:
1
2
3
|
输出在命令行接受的参数
1st
2nd
|
虽然我们现在很少用到String[] arg 这个参数,但JVM仍然只认有这个参数的为main方法,写入其他参数则视为对main方法的重载,自己试试吧!
终上所述,main方法的格式必须是:
public static void main(Sting[ ] arg){ }
补充:
想一下没有main方法的程序能不能运行呢?试着去掉main方法,写上一个静态块:
1
2
3
|
static
{
system.out.printin(
"我是静态块O(∩_∩)O~"
);
}
|
运行一下,看看效果吧!