详细讲解Java中的main()方法_java

前言

JAVA中的主函数是我们再熟悉不过的了,相信每个学习过JAVA语言的人都能够熟练地写出这个程序的入口函数,但对于主函数为什么这么写,其中的每个关键字分别是什么意思,可能就不是所有人都能轻松地答出来的了。我也是在学习中碰到了这个问题,通过在网上搜索资料,并加上自己的实践终于有了一点心得,不敢保留,写出来与大家分享。

Java中的main()方法

java虚拟机通过main方法找到需要启动的运行程序,并且检查main函数所在类是否被java虚拟机装载。如果没有装载,那么就装载该类,并且装载所有相关的其他类。因此程序在运行的时候,第一个执行的方法就是main()方法。通常情况下, 如果要运行一个类的方法,必须首先实例化出来这个类的一个对象,然后通过"对象名.方法名() "的方式来运行方法,但是因为main是程序的入口,这时候还没有实例化对象,因此将main方法声明为static的,这样这个方法就可以直接通过“类名.方法名() ”的方式来调用。

在看Java中的main()方法之前,先看一个最简单的Java应用程序HelloWorld,我将通过这个例子说明Java类中main()方法的奥秘,程序的代码如下:

/**
* Java中的main()方法详解
*/
public class HelloWorld {
 public static void main(String args[]) {
 System.out.println("Hello World!");
 }
}

一、先说类: 

HelloWorld 类中有main()方法,说明这是个java应用程序,通过JVM直接启动运行的程序。
既然是类,java允许类不加public关键字约束,当然类的定义只能限制为public或者无限制关键字(默认的)。

二、再说main()方法

这个main()方法的声明为:public static void main(String args[]) 。必须这么定义,这是Java的规范。

为什么要这么定义,和JVM的运行有关系。

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

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

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

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

因此,main()方法定义必须是:“public static void main(String 字符串数组参数名[]) ”。

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

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

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

public class TestMain {
 public static void main(String[] args) throws Exception {
  System.out.println("哈哈哈哈哈");
  throw new Exception("");
 }
}
运行结果:
哈哈哈哈哈
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

四、main()方法中字符串参数数组作用

main()方法中字符串参数数组作用是接收命令行输入参数的,命令行的参数之间用空格隔开。

下面给出一个例子,看看如何初始化和使用这个数组的。

/**
* 打印main方法中的输入参数
*/
public class TestMain {
 public static void main(String args[]){
 System.out.println("打印main方法中的输入参数!");
 for(int i=0;i<args.length;i++){
  System.out.println(args[i]);
 }
 }
}

执行方法和运行结果

D:\Study\basetest\src>javac TestMain.java 

D:\Study\basetest\src>java TestMain 1 2 3
打印main方法中的输入参数!
1
2
3 

五、给出HelloWorld的另外一个版本

/**
* 变态版的HelloWorld.呵呵
*/
public class HelloWorld2 {
 static {
 System.out.println("Hello Wordld!");
 }
 public static void main(String args[]){
 System.exit(0);
 }
}

这个main()方法执行的内容就一句" System.exit(0); " ,目的是让程序正常结束。那“HelloWorld!”是从哪里打印的,秘密就是在static打印的,因为static代码块的内容会在main调用前调用。

六、实例

虚拟机通过调用某个指定类的方法main启动,传递给main一个字符串数组参数,使指定的类被装载,同时链接该类所使用的其它的类型,并且初始化它们。例如对于程序:

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

编译后在命令行模式下键入: java HelloApp run virtual machine

将通过调用HelloApp的方法main来启动java虚拟机,传递给main一个包含三个字符串"run"、"virtual"、"machine"的数组。现在我们略述虚拟机在执行HelloApp时可能采取的步骤。

开始试图执行类HelloApp的main方法,发现该类并没有被装载,也就是说虚拟机当前不包含该类的二进制代表,于是虚拟机使用ClassLoader试图寻找这样的二进制代表。如果这个进程失败,则抛出一个异常。类被装载后同时在main方法被调用之前,必须对类HelloApp与其它类型进行链接然后初始化。链接包含三个阶段:检验,准备和解析。检验检查被装载的主类的符号和语义,准备则创建类或接口的静态域以及把这些域初始化为标准的默认值,解析负责检查主类对其它类或接口的符号引用,在这一步它是可选的。类的初始化是对类中声明的静态初始化函数和静态域的初始化构造方法的执行。一个类在初始化之前它的父类必须被初始化。

整个过程如下:

总结

main方法作为一个特殊的规范,与普通的方法有很大区别,限制很多,理解其原理需要学习JVM相关知识。是Java中学习中大障碍。以上就是小编为大家整理的对main原理和使用的总结,希望对大家能有所帮助,如果有疑问大家可以留言交流。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java中main方法
, java类中的main方法
java中的main函数
java笔试题及详细讲解、java面试题及详细讲解、java main方法、java中main方法、java运行main方法,以便于您获取更多的相关知识。

时间: 2024-11-02 10:50:13

详细讲解Java中的main()方法_java的相关文章

浅谈java 执行jar包中的main方法_java

浅谈java 执行jar包中的main方法 通过 OneJar 或 Maven 打包后 jar 文件,用命令: java -jar ****.jar 执行后总是运行指定的主方法,如果 jar 中有多个 main 方法,那么如何运行指定的 main 方法呢? 用下面的命令试试看: java -classpath ****.jar ****.****.className [args] "****.****"表示"包名": "className"表示&

举例讲解Java中的多线程编程_java

Java创建线程(Runnable接口和Thread类) 大多数情况,通过实例化一个Thread对象来创建一个线程.Java定义了两种方式: 实现Runnable 接口: 可以继承Thread类. 下面的依次介绍了每一种方式.实现Runnable接口 创建线程的最简单的方法就是创建一个实现Runnable 接口的类.Runnable抽象了一个执行代码单元.你可以通过实现Runnable接口的方法创建每一个对象的线程.为实现Runnable 接口,一个类仅需实现一个run()的简单方法,该方法声明

Myeclipse中没有main方法怎么运行一个.java文件?

问题描述 Myeclipse中没有main方法怎么运行一个.java文件? **平时测试一些代码,都是建立一个普通的.java文件,然后在main方法里面写测试代码的,今天看网上的教学视频,人家没有main方法,只有一个public void testAdd() 方法,居然也是一样点击上面绿色三角的Run按钮,就可以运行这个testAdd()方法里的测试代码了,我也一样操作就报错了,如下两图分别是代码和报错信息,请问是不是要做一些设置才可以这样执行呢?没有main方法的 .java类怎么可以执行

java web-Javaweb在Java类的main方法中无法通过Proxool连接数据库

问题描述 Javaweb在Java类的main方法中无法通过Proxool连接数据库 Javaweb在Java类的main方法中无法通过Proxool连接数据库,报SQLException,找不到驱动,同样的代码启动tomcat后在服务器中能运行??????? 解决方案 有两个可能,一个是jar包没有引入全:还有一个就是配置文件的编码方式,把配置文件打开看看有没有乱码

浅谈Java中的hashcode方法(推荐)_java

哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native int hashCode(); 根据这个方法的声明可知,该方法返回一个int类型的数值,并且是本地方法,因此在Object类中并没有给出具体的实现. 为何Object类需要这样一个方法?它有什么作用呢?今天我们就来具体探讨一下hashCode方法. 一.hashCode方法的作用 对于包含容器类型的程序设计语言来说,基本上都会涉及到has

批处理调用java程序中的main方法

问题描述 使用Eclipse创建了一个java程序,想用批处理来调用类中的main方法,并将system.out的打印信息存到本地,批处理要怎么写 解决方案 解决方案二:批处理里面调用命令java.java命令就是执行main函数的

JAVA中AES加密方法实例分析_java

本文实例讲述了JAVA中AES加密方法.分享给大家供大家参考.具体如下: java代码: KeyGenerator kg = KeyGenerator.getInstance("AES"); //获取密匙生成器 kg.init(256); //初始化 //DES算法必须是56位 //DESede算法可以是112位或168位 //AES算法可以是128.192.256位 SecretKey key = kg.generateKey(); //生成密匙,可用多种方法来保存密匙 加密: Ci

PL/SQL实现JAVA中的split()方法的例子_java

众所周知,java中为String类提供了split()字符串分割的方法,所以很容易将字符串以指定的符号分割为一个字符串数组.但是在pl/sql中并没有提供像java中的split()方法,所以要想在pl/sql中实现字符串的分割还需要自己动手.由于在项目中需要用到此类方法,所以自己研究了一下,方便以后参考.这里以逗号作为分隔符为例,代码如下: declare v_str varchar2(200) := 'abd,324,u78,23f,sd09,2345,dsaf,9079'; type s

java中有关get方法的使用(具体程序分析)

问题描述 java中有关get方法的使用(具体程序分析) 最近在学习java,用的徐彩霞的java基础教程. 有个例子不太明白. /* /注释部分的get部分有和没有结果一样,想知道为什么要用get? 又必须要用的情况吗? 刚学,懂得比较少,谢谢了~ class Person { private String name; private int age; private void talk() { System.out.print("I'm "+name+" and &quo