main()方法为啥必须要public static void类型的??java中的静态成员

本文详细介绍了Java中主方法(main method)的作用及其规范,并深入探讨了静态成员(static members)的概念、用法及注意事项。

 1.main()方法

  在java中,main()方法是java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,比如方法的名字必须是main,方法必须是public static void类型的,方法必须是接受一个字符串数组的参数等。

  因为main()方法是由Java虚拟机调用的,所以必须是public,虚拟机调用的main()方法的时候,不需要产生任何对象,所以main()方法声明为static,且不需要返回值,所以必须声明为void,最终格式如下所示:    public void main(String[] args)

  在学习java中的main()方法之前,先看下面一段程序:

复制代码
  
1 public class Demo
2 {
3 public static void main(String[] args)
4 {
5 System.out.println( " 打印main方法的输入参数 " );
6 for ( int i = 0 ;i < args.length;i ++ ){
7 System.out.println(args[i]);
8 }
9 }
10 }
复制代码

  现在对上面的程序做一个简单的解释,Demo类中有main()方法,说明这是个Java应用程序,通过JVM直接启动运行的程序。main()方法中有一个输入参数,类型为String[],这个也是java中的规范,至于字符串的名字,这个可以自己设定,根据习惯,这个字符串数组的名字一般和Sun Java规范范例中的main()的参数名保持一致,取名为args。而且main()方法不准抛出异常,因此main()方法中的异常要么不处理,要么不处理,不能继续抛出。

  main()方法中的字符串参数数组的作用是结婚搜命令行输入参数,命令行的参数之间用空格隔开。下面为上述程序段运行结果:

2.java中静态成员

  通常情况下,方法必须通过它的类对象访问。但是如果该方法的使用完全对立于该类的任何对象,可以利用static关键字。通过该关键字可以创建一个方法或者变量,它能够被自己使用,而不用引用特定的示例。在方法或变量前面加上static即可。

  如果一个方法被声明为static,它就能够在它的类任何对象创建之前被访问,而不必引用任何对象。下面示例中,演示静态方法和静态变量的使用。

复制代码
  
1 public class StaticDemo1
2 {
3 // s为静态变量
4   public static String s = " 我是静态变量 " ;
5 // 静态方法
6   public static void printInfo(){
7 System.out.println( " 我是静态方法 " );
8 }
9 public static void main(String[] args){
10 // 调用StaticDemo1中的printInfo方法时,不需要创建新的
11 // StaticDemo1对象,直接访问即可
12   StaticDemo1.printInfo();
13 // 直接调用StaticDemo1中的s变量时,直接访问即可
14   System.out.println(StaticDemo1.s);
15 }
16 }
复制代码

运行结果:

  在Java中没有一个直接的修饰符来实现常量,而是通过静态成员变量的方式来实现的,如: public static final int X=20;  static public final int Y=30;  static表示属于类,不必创建对象可以使用,因为常量应该不依赖任何对象,final表示值不能改变。一般用作常量的静态成员变量访问权限设置为public,因为常量应该允许所有的类或对象访问。

  对于非静态成员变量,系统不会为其分配默认值,必须在构造器完成之前对其初始化。对于静态成员变量,系统也不会为其分配默认值,也要求开发人员必须对其进行初始化。但是静态变量属于类,是不能等到构造器运行在初始化的,因为类加载完成之后其值必须可以使用。在Java中,静态成员变量的的初始化要求在静态语句块结束之前必须完成。即Java中静态成员变量的初始化时机有两个,在声明的同时进行初始化或者在静态语句块中进行初始化。

复制代码
  
1 // 功能:初始化静态成员变量介绍
2   public class StaticDemo2
3 {
4 // 声明并初始化常量const1
5   public static final int const1 = 1111 ;
6 // 声明常量const2
7   public static final int const2;
8 /** ********************************
9 下面为静态语句块,是静态成员的一种。在此静态语句中初始化了常量
10 const2.静态语句块在类加载时执行一次,可以将对类进行初始化的代码写在其中。
11 ********************************** */
12 static {
13 // 初始化常量const2
14   const2 = 2222 ;
15 }
16 public static void main(String [] args){
17 System.out.println( " 两个常量的值分别为const1= " + const1 + " ,const2= " + const2);
18 }
19 }
复制代码

  如果将第11到15行注释掉,在次进行编译,就会报“可能尚未初始化变量const2”错误。

  对于静态成员的访问,可以直接使用"<类名>.<静态成员名>"的语法调用静态成员变量。

  a.静态方法访问非静态成员

复制代码
  
1 public class StaticDemo3
2 {
3 int var = 13 ;
4 public static void main(String[] args){
5 System.out.println( " 成员变量var的值为: " + var);
6 }
7 }
复制代码

编译代码,运行结果:

  从上图可以看出,编译报“无法从静态上下文中引用非静态变量 var”错,这是因为main()方法自身便是一个静态方法,而var是非静态成员。因为静态成员不依赖于该类的任何对象,所以当其所在的类加载成功后,就可以被访问了,此时对象并不一定存在,非静态成员自然也不一定存在,静态成员的生命周期比非静态成员的长。即使访问时存在非静态成员,静态方法也不一定知道访问的是哪一个对象的成员,因为静态方法属于类,非静态成员属于对象,所以静态方法将不知道关于其所属类对象的消息。而静态方法访问静态成员时,自然是任何时候都没有问题,静态成员都属于类,只要类存在,静态成员都存在。同样的道理,在静态方法中是不能使用this预定义对象引用的,即使其后边所操作的也是静态成员也不行。因为this代表指向自己对象的引用,而静态方法是属于类的,不属于对象,其成功加载后,对象还不一定存在,也不知道this指的是哪一个对象。

复制代码
  
1 public class StaticDemo4
2 {
3 static int x = 100 ;
4 public static void main(String[] args){
5 int y = this .x;
6 }
7 }
复制代码

编译后,运行结果:

  b.非静态方法访问静态成员

  非静态方法访问静态成员的时候,规则比较简单。非静态成员的生命周期被静态成员生命周期包含,因此当非静态成员存在的时候,静态成员绝对存在。故非静态方法在任何时候都可以访问静态成员。

http://www.cnblogs.com/wannianma/archive/2011/04/03/wannianma.html

### Java 中 `public static void main` 方法的作用及参数说明 #### 作用 在 Java 编程语言中,`public static void main(String[] args)` 是每一个独立运行的应用程序入口点。当启动一个 Java 应用程序时,Java 虚拟机 (JVM) 将寻找并调用此方法作为程序执行的第一步[^1]。该方法具有特定的签名和修饰符组合,这是 JVM 所必需的标准形式。 - **`public`**: 这一关键字表示该方法可以被外部访问。由于它是程序的起点,因此必须对外公开以便 JVM 可以找到并调用它[^3]。 - **`static`**: 表明这是一个静态方法,意味着它可以无需创建类的实例而直接通过类名调用。这使得 JVM 不必先初始化对象即可执行代码[^5]。 - **`void`**: 返回类型为 `void` 的方法不会返回任何值。对于主方法而言,其职责仅在于控制流程而非提供计算结果给其他部分,所以采用无返回的设计[^4]。 - **`String[] args` 参数列表**:允许传递命令行输入到应用程序中。这些字符串代表来自终端或其他环境下的用户数据或配置选项等信息[^2]。 以下是标准的 `main` 方法定义及其基本结构: ```java public class MainClass { public static void main(String[] args) { System.out.println("Hello, world!"); } } ``` 上述例子展示了如何利用 `main` 函数打印简单的问候语句至控制台窗口上。 #### 关键字解释与必要性分析 如果尝试改变其中任何一个关键词,则可能导致编译错误或者无法正常加载应用的情况发生。下面逐一探讨各个组成部分的重要性以及移除它们可能带来的后果: - 如果缺少 `public`, 则因为权限不足,JVM找不到可执行的方法. - 去掉 `static` 后需要实例化类才可以调用非静态版本的同名函数;然而此时还没有机会建立此类实体之前就已经停止工作了. - 更改成有返回值得话违反惯例而且不符合实际需求场景. 综上所述 ,只有保持原始形态才能满足预期功能要求 .
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值