Java的main方法浅析

一、main方法的定义

public static void main(String[ ] arg){

……

}

在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,比如方法的名字必须是main,方法必须是public static void 类型的,方法必须接收一个字符串数组的参数等等。为什么要这么定义,和JVM的运行有关系。java虚拟机通过main方法找到需要启动的运行程序,并且检查main函数所在类是否被java虚拟机装载。如果没有装载,那么就装载该类,并且装载所有相关的其他类。因此程序在运行的时候,第一个执行的方法就是main()方法。通常情况下,如果要运行一个类的方法,必须首先实例化出来这个类的一个对象,然后通过"对象名.方法名()"的方式来运行方法,但是因为main是程序的入口,这时候还没有实例化对象,因此将main方法声明为static的,这样这个方法就可以直接通过“类名.方法名()”的方式来调用。

当一个类中有main()方法,执行命令“java类名”则会启动虚拟机执行该类中的main方法。

由于JVM在运行这个Java应用程序的时候,首先会调用main方法,调用时不实例化这个类的对象,而是通过类名直接调用因此需要是限制为publicstatic。

对于java中的main方法,jvm有限制,不能有返回值,因此返回值类型为void。

main方法中还有一个输入参数,类型为String[],这个也是java的规范,main()方法中必须有一个入参,类细必须String[],至于字符串数组的名字,这个是可以自己设定的,根据习惯,这个字符串数组的名字一般和sun java规范范例中main参数名保持一致,取名为args。

1.关键字public

public是一个访问权限修饰符,与public相对应的还有protected、默认(没有任何权限修饰符)、private,四种修饰符如其名称所示,分别对应公有、受保护、缺省、私有四种访问级别。外部类仅能处于公有与缺省级别,而内部类、变量、方法可根据需要处于四种级别中任意一种。四种修饰符修饰的类、变量与方法的可见性:

访问级别

同类

同包

子类

其他地方

公有

可访问

可访问

可访问

可访问

受保护

可访问

可访问

可访问

 

缺省

可访问

可访问

 

 

私有

可访问

 

 

 

注:空白处均为不可访问

2.关键字static

通常我们想要使用某个类的属性或方法时,我们需要创建一个类的对象,并用new为该类分配数据空间。但当我们需要让所有对象共用一个属性时,或让某个属性/方法不与包含它的类的任何对象关联在一起,能在没有创建对象时直接调用时,这种方法显然不再适用,而static关键字却很好的解决了这一问题。让我们来看一段小程序

public classTest{

       public static String s="这是一个静态变量";

       public static void output(){

          System.out.println(s);

   }  

}

接着我们在mian方法中执行

Test.s="静态变量被初始化了";

Test.output();

System.out.println("*************");

Testf01=new Test();

Testf02=new Test();

f01.s="第一次改变静态变量";

f01.output();

f02.s="第二次改变静态变量";

System.out.println(f01.s);

程序运行后得到输出:

静态变量被初始化了

*************

第一次改变静态变量

第二次改变静态变量

从这段程序中可以看见,调用静态方法或变量有两种方法,第一种:通过类名与点运算符调用;第二种:通过对象与点运算符调用。但推荐使用第一种方法,它强调了静态变量与方法的静态性。另外对象f02s作了修改,可以看见f01.s值也发生了改变,这对普通变量是不可理喻的,但在这里,静态变量只有一份存储空间,在加载类的过程完成静态变量的内存分配,因此任何一个对象对静态变量的修改,都可以反应到其他对象中。

基于静态方法可在没有创建对象时直接调用的特殊性,对其也有一些限制:

静态方法不能调用非静态属性或方法

静态方法中不能引用this 、super关键字

3.关键字void

void修饰方法时,该方法的没有返回值,注意:没有返回值与返回值为空(return null)是不同的两个概念,返回值为空它有返回值,并且返回值为null

4.String[ ] arg

这是一个简单的字符串数组的定义,可根据自己的习惯写为String[ ] argStringarg[ ],其中arg为自己写的数组名。

说了这么多,大家对main方法格式中出现的关键字应该都有了大致了解,现在我们回到main方法上来看看为什么是publicstatic void mainString[] arg)。

首先,main方法是JVMjava虚拟机)自动调用,JVM调用main方法的位置自然不会在某个类中、或某个包中,因此只有当main方法在公有级别上时,才对JVM可见,所以main方法需要public修饰,同理,main方法所在的类也需要public修饰符。由于main方法是所有程序的入口,也就是main被调用时没有任何对象创建,不通过对象调用某一方法,只有将该方法定义为静态方法,所以main方法是一个静态方法,需要static修饰。JVM对于java程序已经是最底层,由它调用的方法的返回值已经没有任何地方可去,因此,main方法返回值为空,既需用void修饰。至于main方法的参数String[] arg我们现在已经很少有机会去用它了,它用于在接受命令行传入的参数,试一下面的小程序吧:

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文件,然后在命令行转到该文件目录,并输入:

javac Test.java

java Test 1st 2nd

1st 2nd用空格隔开,运行结果:

输出在命令行接受的参数

1st

2nd

虽然我们现在很少用到String[] arg 这个参数,但JVM仍然只认有这个参数的为main方法,写入其他参数则视为对main方法的重载,自己试试吧!

终上所述,main方法的格式必须是publicstatic void main(Sting[ ] arg)

二、main()方法中可以throw Exception   

因此main()方法中可以抛出异常,main()方法上也可以声明抛出异常。   

比如,下面这个写法是正确的: 

public class TestMain {  

     public static void main(String[] args) throws Exception {   

         System.out.println("哈哈哈");                  

         throw new Exception("");          

    }  

}   

运行结果: 哈哈哈

三、HelloWorld的另外一个版本    

public class HelloWorld {      

    static {  

           System.out.println("Hello Wordld!");      

     }  

    public static void main(String args[]){          

           System.exit(0);      

    }  

}   

这个main()方法执行的内容就一句"System.exit(0);" ,目的是让程序正常结束。那“HelloWorld!”是从哪里打印的,秘密就是在static打印的,因为static代码块的内容会在main调用前调用。(原因在于Java虚拟机在执行HelloWorld的时候,首先加载类,然后执行内部的静态块,执行完静态块后才去调用main方法)  

Exception in thread "main" java.lang.Exception:       

  at maintest.TestMain.main(TestMain.java:11)  

  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)  

  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)  

  at java.lang.reflect.Method.invoke(Method.java:585)  

  at com.intellij.rt.execution.application.AppMain.main(AppMain.java:90)   

Process finished with exit code 1

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值