zoukankan      html  css  js  c++  java
  • Java程序入口:main()方法讲解

    Java程序的入口---main()方法的签名为:public static void main(String[] args) {...} ,其中,

    public修饰符:Java类由JVM调用,为了让JVM可以自由调用这个main()方法,所以使用public修饰符把这个方法暴露出来。

    static修饰符:JVM调用这个主方法时,不会先创建该主类的对象,然后通过对象来调用该主方法。JVM直接通过该类来调用主方法,因此使用static修饰该主方法。

    ♦ void返回值:因为主方法被JVM调用,该方法的返回值将返回给JVM,这没有任何意义,因此main()方法没有返回值。

    上面方法中还包括一个字符串数组形参String[] args,根据方法调用的规则:谁调用方法,谁负责为形参赋值。也就是说,main()方法由JVM调用,即args形参应该由JVM负责赋值。但JVM怎么知道为args数组赋值呢?先看下面程序:

    public class ArgsTest{

      public static void main(String[] args){

        //输出args数组的长度

        System.out.println(args.length);

        //遍历args数组的每一个元素

        for(String arg : args){

          System.out.println(arg);

        }

      }

    }

    上面程序是最简单的“hello world”程序,只是这个程序增加了输出args数组的长度,遍历arg数组元素的代码。使用java ArgsTest命令运行上面的程序,看到程序仅仅输出一个0,这表明args数值是一个长度为0的数组,这是合理的,因为计算机是没有思考能力的,它只能忠诚地执行用户交给它的任务,既然程序没有给args数组设定参数值,那么JVM就不知道args数组的元素,所以JVM将args数组设置为一个长度为0的数组。

    改为一下命令运行上面的程序:

    java ArgsTest Java Spring

    打印结果为:

    2

    Java

    Spring

    可以得出,如果运行java程序时在类名后面紧跟一个或多个字符串(多个字符串以空格隔开),JVM就会把这些字符串一次赋值给args数组元素。运行Java程序时的参数与args数组之间的关系为:第一个参数对应第一个数组元素,第二个参数对应第二个数组元素,... ,以此类推。

    如果某参数本身包含了空格,则应该将该参数用双引号""括起来,否则JVM会把这个空格当成参数分隔符,而不是当成参数本身。例如,采用如下命令来运行上面的程序:

    java ArgsTest "Java Spring"

    看到args的长度是1,只有一个数组元素,其值是Java Spring。

    问题:如何实现在main()方法执行之前输出"hello world"?

    众所周知,在Java语言中,main()方法是程序的入口方法,在程序运行时,最先加载的就是main()方法,但这是否意味着main()方法就是程序运行时第一个被执行的模块呢?

    答案是否定的。在Java语言中,由于静态块在类被加载时就会被调用,因此可以在main()方法执行前,利用静态块实现输出“hello world”的功能,示例如下:

    public class Test{

      static{

        System.out.println("hello world");

      }

      public static void main(String[] args){

        System.out.println("hello my world");

      }

    }

    程序运行结果为:

    hello world

    hello my world

    由于静态代码块不管顺序如何,都会在main()方法执行之前执行,因此,以下代码会与上面的代码有同样的输出结果:

    public class Test{

      public static void main(String[] args){

        System.out.println("hello my world");    

        static{

          System.out.println("hello world");

        }

      }

    }

    关注微信公众号【Java典籍】,收看更多java技术干货

     ▼微信扫一扫下图↓↓↓二维码关注

     

  • 相关阅读:
    2018 ACM 网络选拔赛 徐州赛区
    2018 ACM 网络选拔赛 焦作赛区
    2018 ACM 网络选拔赛 沈阳赛区
    poj 2289 网络流 and 二分查找
    poj 2446 二分图最大匹配
    poj 1469 二分图最大匹配
    poj 3249 拓扑排序 and 动态规划
    poj 3687 拓扑排序
    poj 2585 拓扑排序
    poj 1094 拓扑排序
  • 原文地址:https://www.cnblogs.com/bingyimeiling/p/10409728.html
Copyright © 2011-2022 走看看