Bootstrap

为什么Java中的main方法定义为public static void main(String[] args)

为什么Java中的main方法定义为public static void main(String[] args)

我们在学习java的时候,我想我们写出的第一个程序是下面这样

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

但是有没有想过为什么我们要这样写,首先看main方法中的语句System.out.println(),从面向对象的角度去理解本句语句我们调用的为System的out的println方法,意思就是我们本句语句调用的为系统的输出方法,这也就解释的通为什么在控制台看的到hello world字样。

接下来解释一下public static void main(String[] args){}

首先解释main方法为什么是静态的?

如果该方法不为静态的,就会被构造器进行重载,这将会导致jvm不知道调用那个main方法

静态成员加载到内存中不需要创建实体就可以直接调用,如果不是static的Jvm就需要创建对应的实体对象进行调用,如果是静态的jvm在加载的时候就会自动加载到main方法进行调用

如果除去static关键字将会 :

public void main(String[] args){   
   System.out.println("hello world");
}
错误: main 方法不是类 Demo1 中的static, 请将 main 方法定义为:
   public static void main(String[] args)

为什么要使用public这种公共的权限?

java中提供了public、private、protected、默认的四种权限修饰符,任何的变量都可以使用public权限,将main方法设置为public,JVM可以从任何地方访问并执行该方法。如果设置为其他类型,会导致JVM在某些时候无法访问到main方法,进而无法执行该程序。

如果除去public权限修饰符将会:

static void main(String[] args){
   System.out.println("hello world");
}
错误: 在类 Demo1 中找不到 main 方法, 请将 main 方法定义为:
   public static void main(String[] args)
否则 JavaFX 应用程序类必须扩展javafx.application.Application

为什么使用void返回类型?

java中的基本类型有8种为什么不选择其中的一种?

如果学习过或者了解过C/C++程序的话我们的主函数的返回值为int型,且为0时程序结束。而在Java程序中 ,void 返回值表示了不由程序返回 “exit code” 退出,当没有其他守护线程的时候 JVM 会调用"Shutdown Hook" 退出,如果有守护线程在运行 JVM 不会退出。在 Java 中想要实现像 C 语言那样的退出可以调用System.exit(0);这个方法让程序退出。

public  static int main(String[] args){
   System.out.println("hello world");
    return 0;
}
错误: main 方法必须返回类 Demo1 中的空类型值, 请
将 main 方法定义为:
   public static void main(String[] args)

接下来我们来看一下main方法中所传递的参数args

既然作为程序的主方法程序的开始,在没有了解之前我认为main方法应该是一切程序的开始,为什么还有参数的传递,这个参数又应该如何传递?

当我们把java源码用javac工具进行编译之后生成.class文件,我们使用java 类名的方式就可以执行java程序,当我们利用java 类名 参数的形式执行时就会发现args这个String数组并不是为空的。设计这个的目的主要是为了程序员更好的与程序进行交互。

public  static void main(String[] args){   
   System.out.println(args[0]);
}
$ java Demo1 test1
test1

看到这里我想应该就初步理解了main方法书写格式了,以及为什么要规定为这样了。

其实我们还可以使用如下方式书写main方法,其实主要保证其为public、static、void即可

1)由于publicstatic没有先后顺序关系,由此下面的定义也是合理的:
       static public void main(String[] args)
2)也可以把main方法定义为finalpublic static final void main(String[]args)
3)也可以用synchronized来修饰main方法:
       static public synchronized void main(String[] args)

如果要是一个类中没有main方法,又进行了执行会 NoSuchMethodError

错误: 在类 Demo1 中找不到 main 方法, 请将 main 方法定义为:
   public static void main(String[] args)
否则 JavaFX 应用程序类必须扩展javafx.application.Application
总结一下

public static void main(String[] args){}为Java程序的入口方法,JVM在运行程序的时候,会首先查找main方法。其中,public是权限修饰符,表明任何类或对象都可以访问这个方法,static表明main方法是一个静态方法,即方法中的代码是存储在静态存储区的,只要类被加载后,就可以使用该方法而不需要通过实例化对象来访问,可以直接通过类名.main()直接访问,JVM在启动的时候就是按照上述方法的签名(必须有public与static修饰,返回值为void,且方法的参数为字符串数组)来查找方法的入口地址,如果能找到就执行,找不到则会报错。void表明方法没有返回值,main是JVM识别的特殊方法名,是程序的入口方法。字符串数组参数args为开发人员在命令行状态下与程序交互提供了一种手段。因为main为程序的入口方法,因此当程序运行的时候,第一个执行的方法就是main方法。通常来讲,要执行一个类的方法,首先必须实例化一个类的对象,然后通过对象来调用这个方法。但是由于main是程序的入口方法,此时还没有实例化对象,因此在编写main方法的时候就要求不需要实例化对象就可以调用这个方法,鉴于此,main方法需要被定义成public static void main(String[] args){}。

;