解析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方法这些,了解就行

Java Spark应用程序中,通常使用Apache Commons CLI库或者直接通过命令行参数的方式处理来自main函数参数。如果你想要解析命令行参数,可以按照以下步骤操作: 1. **添加依赖**: 如果还没有使用Apache Commons CLI,需要先添加到你的pom.xml文件中(如果你使用的是Maven): ```xml <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-cli</artifactId> <version>1.4</version> <!-- 或者最新的版本 --> </dependency> ``` 2. **创建Main类并解析参数**: ```java import org.apache.commons.cli.*; public class SparkApp { public static void main(String[] args) { // 创建命令行解析器 Options options = new Options(); // 添加选项 Option helpOption = new Option("h", "help", false, "显示帮助信息"); Option inputFileOption = new Option("i", "input", true, "输入文件路径"); Option outputFileOption = new Option("o", "output", true, "输出文件路径"); // 将选项添加到解析器 options.addOption(helpOption); options.addOption(inputFileOption); options.addOption(outputFileOption); try { // 解析命令行参数 CommandLineParser parser = new DefaultParser(); CommandLine cmd = parser.parse(options, args); if (cmd.hasOption("help")) { printUsage(options); return; } String inputFilePath = cmd.getOptionValue("input"); String outputFilePath = cmd.getOptionValue("output"); // 使用解析后的参数做相应处理 processFiles(inputFilePath, outputFilePath); } catch (ParseException e) { System.err.println(e.getMessage()); printUsage(options); } } private static void printUsage(Options options) { HelpFormatter formatter = new HelpFormatter(); formatter.printHelp("your-program-name", options); } private static void processFiles(String input, String output) { // 你的处理逻辑... } } ``` 在这个例子中,`processFiles()`方法会接收`inputFilePath`和`outputFilePath`作为参数。运行程序时,你可以通过`java -jar your-app.jar -i input.txt -o output.txt`的形式指定参数
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值