解析java中main函数为什么是这样写

我们在写程序的过程主函数都是固定的,但是这是不是意味着完全不能改呢?
不是的,现在就来深入一下主函数的写法意义…

/*
 * 主函数是一个特殊的函数,作为程序的入口,可被jvm调用
 * 
 * 主函数的定义:
 * public:代表该函数访问权限是最大的
 * static:代表主函数随着类的加载就已经存在了
 * void:主函数没有具体的返回值,即为空
 * main:不是关键字,但是是一个特殊的单词,可以被jvm识别
 * (String[] arr):函数的参数,参数类型是一个数组,该数组中的元素是字符串,字符串
 * 类型的数组
 * 
 * 主函数是固定格式的,jvm识别
 * */
public class MainDemo {

    public static void main(String[] args) 
    {
        System.out.println("Hello World!");
    }
    public static void main(int x)
    {
        System.out.println("Hello");
    }
}

可能上面的注释(String[] arr)刚开始以为是写错,事实上它就是代表一个字符串数组,主函数传进来的是一个字符串数组
编译运行后输出的是:Hello World!
首先一看上去我们会有个疑惑,好像出现了两个主函数…
但是,要知道,主函数也是一种特殊的函数,其实这是一种函数的重载,第二个“main函数”传入的是int 类型的参数,参数不同,可以知道这是函数重载,那么,执行的只有第一个真正的main函数,这说明,整个程序的入口还是在真正的main函数,无论把第二个“main函数”放到真正main函数的前面,编译运行的结果都不会变

接下来一个问题,main函数参数String[] 看出是字符串数组,那这个args是什么东西,其实它就是变量名,那么既然是参数里的变量名,就可以任我们取名字了,

public class MainDemo {

    public static void main(String[] x) 
    {
        System.out.println("Hello World!");
    }

}

这个样子编译是通过的,这说明主函数不一定要public static void main(String[] args) 这样子,不过这是一种约定的俗称,我们才把它写为args,这个args原形是arguments(参数),只不过是为了简写,才简化为args。

再来想一个问题,jvm调用main函数,参数为String[] args,那jvm传入的到底是啥?

public class MainDemo {

    public static void main(String[] args) 
    {
        System.out.println(args);
    }

}

编译运行,结果是 [Ljava.lang.String;@15db9742
一眼看过去并不知道这什么东西,再来追究一下看看,分别代表
数组 实体 String类型 哈希值
我们知道,String只有接收两玩意
String[ ] args = new Srting[3] ; //数组实体,有长度
String[ ] args = null; //为空
而根据结果知道并不为null,说明它传入的是一个实体数组,既然数组有了,试一下打印长度

public class MainDemo {

    public static void main(String[] args) //new String[]
    {
        System.out.println(args.length);
    }

}

运行结果为0
这时可以下一个结论:
jvm在调用主函数时,传入的是new String[0];
接下来试试打印数组元素的值

public class MainDemo {

    public static void main(String[] args) //new String [0]
    {
        System.out.println(args[0]);
    }

}

运行结果如下

Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 0
at practice.MainDemo.main(MainDemo.java:19)

这是一个数组越界的异常,很正常,因为new String[0],说明里面没有元素,也就不存在第一个元素
这有什么用途呢,既然jvm可以往里面传值,我们也可以传我们需要的值
要执行哪个类,我们就把这个类的类型作为参数传进jvm,而且传这个类的同时它会去调用这个类的main方法,我们可以在这个类的后边继续传一些值,叫做主函数的参数
打开cmd,javac为编译,java即调用了虚拟机,我们就这个时候传值。。

D:>javac MainDemo.java
D:>java MainDemo haha heihei xixi

结果运行结果为:haha
这个时候,上面程序的就不会抛出异常了
args[0]的值为haha
这说明jvm做了这样一件事:将类后面跟的这些数据(空格隔开为一个数据)自动存入到长度为3的数组中,为了验证,我们打印所有数组的元素。

public class MainDemo {

    public static void main(String[] args) 
    {
        for(int i=0;i<args.length;i++)
            System.out.println(args[i]);
    }

}

D:>javac MainDemo.java
D:>java MainDemo haha heihei xixi
haha
heihei
xixi

运行OK,三个元素都打印出来,之后还可以把数组元素单独写在代码里进行传值..
至此,关于main方法这些,了解就行

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值