今天刷C语言程序题时遇到很多关于static关键字的题目,为区分Java中的static继而回到寝室写一篇关于Java中static关键字的使用详解.

先来谈谈Java中的static

1
2
3
"static方法就是没有this的方法.在static方法内部不能调用非静态方法,反过来是可以的.而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法.这实际上正是static方法的主要用途.   ———— 《 Java编程思想 》"

总结为一句话:方便在没有创建对象的情况下来进行调用(方法/变量).
  • static 变量

    1
    2
    3
    static 变量也称作静态变量.
    静态变量: 静态变量被所有的对象所共享,在内存中只有一个副本.它当且仅当在类初次加载时会被初始化.
    非静态变量: 是对象所拥有的,在创建对象的时候被初始化.存在多个副本,各个对象拥有的副本互不影响.
  • static 方法

    1
    2
    3
    使用 static 修饰的方法一般称作静态方法.由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来内说是无法使用 this 关键字的,
    因为它不依附于任何对象,既然都没有对象,就谈不上 this 了 ! 继而由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,
    因为非静态成员方法/变量都是必须依赖具体的`对象`才能够被调用.
  • static 代码块

    1
    2
    静态代码块以优化程序性能.static 块可以置于类中的任何地方,类中可以有多个static块.
    在类初次被加载的时候,会按照 static 代码块的顺序逐个执行,并且只会执行一次.

    使用JDBC中简单的Data access obejct实例来讲解如何利用static关键字优化程序性能 ! (っ•̀ω•́)っ✎⁾⁾

  1. 首先创建一个连接数据库的工具类,使用static 代码块解决重复加载驱动问题,提高性能.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    /**
    * @ClassName: JDBCUtil
    * @Description: Connect to the database.
    * @author: Huang Yuhui
    * @date: Mar 13, 2019 3:19:41 PM
    */
    public class JDBCUtil {

    private JDBCUtil() {
    // TODO Auto-generated constructor stub
    }

    // initialize the driver of database.
    static {
    try {
    Class.forName("com.mysql.cj.jdbc.Driver");
    } catch (ClassNotFoundException e) {

    e.printStackTrace();
    }
    }

    // Return a database connection object.
    public static Connection getConnection() {
    Connection connection = null;
    try {
    connection = DriverManager.getConnection("jdbc:mysql://localhost/databaseName?"
    + "useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true", "username", "password");
    } catch (SQLException e) {
    e.printStackTrace();
    }
    return connection;
    }

    // release the resource of connecting.
    public static void freeResource(Connection connection,PreparedStatement preparedStatement,ResultSet resultSet) {
    if(connection!=null) {
    try {
    connection.close();
    } catch (SQLException e) {

    e.printStackTrace();
    }
    }
    if(preparedStatement!=null) {
    try {
    preparedStatement.close();
    } catch (SQLException e) {

    e.printStackTrace();
    }
    }
    if(resultSet!=null) {
    try {
    resultSet.close();
    } catch (SQLException e) {

    e.printStackTrace();
    }
    }
    }
    }
  2. 利用static修饰单独抽取出来的Connection对象使其成为静态变量.继而使得整个DAO可以共享此对象.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    /**
    * @ClassName: basicConnection
    * @Description: Share this object of Connection.
    * @author: Huang Yuhui
    * @date: Mar 13, 2019 3:15:43 PM
    */
    public class basicConnection {

    public static Connection connection = JDBCUtil.getConnection();
    }
  3. 小哥就简写一下DAO层类,便于举例: 增加数据表信息的类 + 删除数据表信息的类 + ······

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    /**
    * @ClassName: basicConnectionTest
    * @Description: Insert the specified data into the database.
    * @author: Huang Yuhui
    * @date: Mar 16, 2019 10:40:11 PM
    */
    public class InsertTest {

    Connection connection = basicConnection.connection;

    @Test
    public void insertInfoTest() {

    System.out.println("insertInfoTest : " + connection);
    }
    }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* @ClassName: DeleteTest
* @Description: Delete the specified data from the database.
* @author: Huang Yuhui
* @date: Mar 16, 2019 11:05:44 PM
*/
public class DeleteTest {

Connection connection2 = basicConnection.connection;

@Test
public void deleteInfoTest() {

System.out.println("deleteInfoTest : " + connection2);
}
}
  1. 利用JUnit测试套件测试Data acess object中所有的测试类.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /**
    * @ClassName: AllTest
    * @Description: Test all class.
    * @author: Huang Yuhui
    * @date: Mar 16, 2019 11:04:58 PM
    *
    */
    @RunWith(Suite.class)
    @SuiteClasses({ InsertTest.class, DeleteTest.class })
    public class AllTest {

    }
  2. 输出结果如下所示.由于Connection对象被抽取且被static修饰为了静态对象.继而在整个DAO中可以共享这个连接数据库的对象.而不必每一个类中都实例化一次连接数据库的对象(Connection)继而提升程序的性能(づ ̄3 ̄)づ╭❤~

    1
    2
    insertInfoTest : com.mysql.cj.jdbc.ConnectionImpl@158a8276
    deleteInfoTest : com.mysql.cj.jdbc.ConnectionImpl@158a8276
  • 哎哟,不知觉又半夜啦! 晚安,好梦. remember love yourself deeply.