zoukankan      html  css  js  c++  java
  • 从Java的Hello,World!说到Static Block

    一般最常见的HelloWorld是这样的

    public class Hello {
    public static void main(String[] args) {
    System.out.println(
    "Hello, World!");
    }
    }
    使用了静态块的HelloWorld
    public class Hello {
    static {
    System.out.println(
    "Hello, World!");
    }

    public static void main(String[] args) {
    }
    }

    上述两个的运行结果都是

    Hello, World!
    

    静态块会在main函数运行前被执行, 从下面的例子, 我们可以看出他们的执行顺序

    public class Hello {
    static {
    System.out.println(
    "Hello, World from static block!");
    }

    public static void main(String[] args) {
    System.out.println(
    "Hello, World from main!");
    }
    }

    执行结果如下:

    Hello, World from static block!
    Hello, World from main
    !

    我们可以看到, 是static块在类加载的时候就执行了.

    你也可以在static块输出了HelloWorld之后就退出, 不会执行main方法

    public class Hello {
    static {
    System.out.println(
    "Hello, World from static block!");
    System.exit(
    0);
    }
    public static void main(String[] args) {
    System.out.println(
    "Hello, World from main!");
    }
    }

    输出结果为

    Hello, World from static block!

    深入static block

    这个static block是在类第一次加载的时候运行, 请看下面的例子, Hello和Hello2两个类, Hello2中引用了Hello的main方法.

    public class Hello {
    static {
    System.out.println(
    "Hello, World from static block!");
    }
    public static void main(String[] args) {
    System.out.println(
    "Hello, World from main!");
    }
    }

    static和main中分别输出一句话

    public class Hello2 {
    public static void main(String[] args) {
    Hello.main(args);
    Hello.main(args);
    }
    }

    我们来运行Hello2的main方法, 输出结果如下

    Hello, World from static block!
    Hello, World from main
    !
    Hello, World from main
    !

    我们可以看到在第一次运行Hello.main的时候, static block运行了, 第二次运行Hello.main的时候, static block没有执行

    我们修改一下Hello2

    public class Hello2 {
    public static void main(String[] args) {
    try {
    Class.forName(
    "Hello");
    }
    catch (ClassNotFoundException e) {
    e.printStackTrace();
    }
    }
    }

    加载Hello类, 输出如下

    Hello, World from static block!

    如果在加载Hello类后, 再运行Hello的main方法了

    public class Hello2 {
    public static void main(String[] args) {
    try {
    Class.forName(
    "Hello");
    }
    catch (ClassNotFoundException e) {
    e.printStackTrace();
    }
    Hello.main(args);
    Hello.main(args);
    }
    }

    输出结果如下

    Hello, World from static block!
    Hello, World from main
    !
    Hello, World from main
    !

    这说明, static block是在第一次加载类的时候执行的. 在实际开发中, 这经常用来加载数据库的JDBC驱动.

    MySQL的JDBC驱动中有这样一段代码

    // Register ourselves with the DriverManager
    static {
    try {
    java.sql.DriverManager.registerDriver(
    new Driver());
    }
    catch (SQLException E) {
    throw new RuntimeException("Can't register driver!");
    }
    }

  • 相关阅读:
    软工实践个人总结
    第03组 每周小结 (3/3)
    第03组 每周小结 (2/3)
    第03组 每周小结(1/3)
    第03组 Beta冲刺 总结
    第03组 Beta冲刺 (5/5)
    第03组 Beta冲刺 (4/5)
    第03组 Beta冲刺 (3/5)
    第03组 Beta冲刺 (2/5)
    第03组 Beta冲刺 (1/5)
  • 原文地址:https://www.cnblogs.com/icejoywoo/p/2041449.html
Copyright © 2011-2022 走看看