`

对static关键字的一点测试

    博客分类:
  • Java
阅读更多

在翻阅《JDK6学习笔记》时,看到static关键字用法,虽然很早就知道大概,但自己没有动手试过,遂决定试试到底static关键字能否带来好处。举个例子,一般情况下,可能在连接数据库时,首先会在自己的类中做一些初始化动作,那么我们假设利用static block来初始数据库的连接与一般数据库连接有什么不同呢,写了如下粗略测试代码:

package cn.xbmu.lib.jfly.test;

import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * 测试Static Block用法,在Static Block中初始化一个数据库连接
 * @author JFly
 */
public class TestStaticBlock {

    private static Connection conn = null;
    static String CLASSFORNAME = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
    static String CONN_STR = "jdbc:sqlserver://localhost:1433;databaseName=oblog";
    static String DB_USER = "sa";
    static String DB_PWD = "";
    private static ResultSet rs = null;


    static {
        try {
            Class.forName(CLASSFORNAME);
            conn = DriverManager.getConnection(CONN_STR, DB_USER, DB_PWD);
            System.out.println("数据库连接已建立!");
        } catch (SQLException ex) {
            Logger.getLogger(TestStaticBlock.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(TestStaticBlock.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    public String getRecord(Connection aConn, int id) {

        try {
            rs = aConn.prepareStatement("select * from oblog_user where userid = " + "'" + id + "'").executeQuery();
            if (rs.next()) {
                System.out.println("rs=" + rs);
                System.out.println("username=" + rs.getString("username"));
                return rs.getString("username");
            }
        } catch (SQLException ex) {
            Logger.getLogger(TestStaticBlock.class.getName()).log(Level.SEVERE, null, ex);
        } 
        
        return "没有记录";
    }

    public static Connection getConn() throws SQLException {
        if (conn != null) {
            return conn;
        }
        return DriverManager.getConnection(CONN_STR, DB_USER, DB_PWD);
    }

    public static void closeConn() throws SQLException {
        if(rs != null) {
            rs.close();
        }
        if(conn != null) {
            conn.close();
        }
    }

    public static void main(String[] args) throws SQLException {
        long beginTime = System.currentTimeMillis();
        TestStaticBlock tsb = new TestStaticBlock();
        //TestStaticBlock.conn = null;
        System.out.println("conn1 = " + TestStaticBlock.conn);
        System.out.println("conn2 = " + TestStaticBlock.getConn());
        System.out.println("username = " + tsb.getRecord(getConn(), 3));
        long endTime = System.currentTimeMillis();

        TestStaticBlock tsb_1 = new TestStaticBlock();
        System.out.println("conn1 = " + TestStaticBlock.conn);
        System.out.println("username = " + tsb_1.getRecord(getConn(), 4));
        
        closeConn();
        System.out.println("执行时间:" + (endTime - beginTime));
    }
}

 

输出执行时间大致为63,而如果静态方法呢,代码如下:

package cn.xbmu.lib.jfly.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * 测试static方法
 * @author JFly
 */
public class TestStaticMethod {

    public static void getUser(int id) {
        String CLASSFORNAME = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
        String CONN_STR = "jdbc:sqlserver://localhost:1433;databaseName=oblog";
        String DB_USER = "sa";
        String DB_PWD = "";
        Connection conn = null;

        long beginTime = System.currentTimeMillis();
        try {
            Class.forName(CLASSFORNAME);
            conn = DriverManager.getConnection(CONN_STR, DB_USER, DB_PWD);

            System.out.println("数据库连接已建立!");

            ResultSet rs = null;
            try {

                rs = conn.prepareStatement("select * from oblog_user where userid = " + "'" + 3 + "'").executeQuery();
                if (rs.next()) {
                    System.out.println("username = " + rs.getString("username"));
                }
            } catch (SQLException ex) {
                Logger.getLogger(TestStaticBlock.class.getName()).log(Level.SEVERE, null, ex);
            } finally {
                if (rs != null) {
                    rs.close();
                }
                if (conn != null) {
                    conn.close();
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        long endTime = System.currentTimeMillis();
        System.out.println("执行时间:" + (endTime - beginTime));
    }

    public static void main(String[] args) {
        TestStaticMethod.getUser(3);
    }
}

 

程序执行时间大致为297,可见static block带来的效率要比static method高很多。

分享到:
评论

相关推荐

    中科开元笔试面试题(不完全记忆版)_嵌入式-常用知识&面试题库_大厂面试真题.doc

    static 关键字的作用是改变变量的生存期和作用域,static 修饰的变量在编译时被初始化,在程序执行时不再被修改。 2. 字符串和字符数组越界问题: 在 C 语言中,字符串和字符数组是非常重要的数据类型。然而,在...

    PHP静态延迟绑定和普通静态效率的对比

    为了改进这一点,PHP引入了static关键字,用于延迟绑定,它允许我们在类的继承体系中按照实际情况引用类名。 下面是一个简单的代码示例,用以展示静态延迟绑定和普通静态绑定的使用方式: ```php class A { ...

    JAVA第一阶段测试题及答案.docx

    这一点体现了Java中对常量定义的标准方式,`public static final`修饰符保证了常量的访问性和不变性,而`MAX`作为常量名,应遵循大写字母命名规则,以体现其作为常量的身份。 接下来,让我们来探讨方法这一概念。在...

    Java基础练习测试题

    题目中的第1题和第2题分别测试了主方法的`static`和`public`修饰符的重要性。如果缺少这些修饰符,程序将无法正常运行。 2. **标识符**:Java中的标识符用于命名变量、类或方法等。合法的标识符应以字母、下划线(_...

    天津大学JAVA期末考试题型解读与复习建议参考 共6页.pdf

    - 强调每个关键字的理解:复习时,学生应确保对Java的所有关键字有清晰的理解,知道它们的作用和特性。例如,`public`, `private`, `protected`, `static`, `final`, `abstract`等,不必每个都能熟练运用,但至少要...

    精品资料(2021-2022年收藏)面向对象技术Java期末复习试卷四.docx

    5. 变量类型:实例变量是类的成员变量,但它们不是通过`static`关键字声明的。`static`关键字用于声明静态变量,这些变量属于类而不是类的实例。局部变量是在方法内部定义的,它们在方法执行时创建,并且在使用前...

    admin-static:#js.la管理员前端

    JavaScript ES6引入了模块系统,通过`import`和`export`关键字实现。 6. **响应式设计**:确保网站在不同设备(桌面、平板、手机)上都能良好展示。这可能通过媒体查询(media queries)和灵活的布局技术实现。 7....

    博文《C#中只启动一个程序实例》中源代码(修订改进版)

    在C#中,我们可以通过多种方式来实现单例,但最常见的方法是使用`static`和`lock`关键字。 在描述中提到了“由于不能删除资源,所以只能这么加后缀”,这可能指的是在创建单例时为了避免资源冲突或文件锁定问题。在...

    js代码-测试ES6的继承方式

    子类也可以通过`static`关键字覆盖或添加静态方法和属性。 5. **访问控制(Access Control)**: ES6提供了`private`和`protected`关键字(但不是所有浏览器都支持),用于限制属性和方法的访问权限。例如,`#`...

    现代编程语言- Kotlin 之美 - 当下最火的编程语言欣赏.pdf

    虽然Kotlin并没有提供“static”关键字或静态成员的概念,但它通过引入“伴生对象”这一概念,巧妙地实现了类似的功能。 **伴生对象示例** ```kotlin class User private constructor(val account: String) { ...

    C#静态调用webservice

    9. **测试与调试**:在部署到生产环境之前,务必对Web Service进行充分的测试,确保所有功能正常工作,并使用调试工具进行问题排查。 通过以上步骤,我们可以利用C#静态调用Web Service,实现从客户端应用程序访问...

    构造一个51单片机的实时操作系统

    - **定义静态变量**:通过在变量前添加`static`关键字,确保即使在函数退出后,变量的状态也能得以保留。但这会消耗更多的RAM,对于RAM资源有限的小型单片机而言,这可能不是最佳选择。 - **临界区保护**:使用RTOS...

    JAVA复习[定义].pdf

    例如,选项B中提到的`static`关键字是用来声明静态成员的,而不是实例变量。 抽象方法是那些没有具体实现的方法,通常在接口或抽象类中声明,用来提供继承的结构。例如,选项B的`public abstract void method();`是...

    神洲数码招程序员面试题

    在神洲数码的程序员面试中,考察的知识点涵盖了多个领域,包括Java、.NET以及基础的编程知识。以下是对这些知识点的详细解析: 1. **Java技术**:题目中提到了J2EE...此外,还测试了考生对问题解决和逻辑思维的能力。

    编写一个函数用来实现对一个整型数组中的10个数升序排列

    在这个场景下,我们需要编写一个函数,该函数接收一个整型数组作为参数,并对其进行升序排序。这涉及到对数组的理解、函数的使用以及排序算法的应用。 首先,我们要明白数组的基本概念。在C#中,数组是一种引用类型...

    编程修养--C语言规范

    2. **static的使用**:合理使用`static`关键字可以控制变量的作用域,减少内存占用。 3. **函数中的代码尺寸**:控制函数的长度,使得函数专注于单一任务,易于理解。 4. **typedef的使用**:通过`typedef`为复杂...

    memcached1

    最近一直在做一个项目的前期设计工作,考虑到... 以上是我在windows下对memcached的一点小学习和实践,在以后的项目开发过程中将会更深入的学习和应用这一缓存工具,也希望和有兴趣的同行一起讨论学习该工具的使用~~

    java存取oracle中的COLB类型数据.pdf

    在 Java 中,对中文的支持并不是太好,这一点让不少的开发者感到很是头痛。例如,在插入到数据库中的中文问题要转换成编码,从数据库中读到中文又要转换成编码。可以使用以下代码来解决编码问题: public class ...

    linux c函数整理

    - `for`:循环结构的一种,允许初始化、测试和更新三个操作在一个单独的语句中。 - `goto`:无条件地跳转到标记的位置。 - `inline`:建议编译器将函数调用处替换为函数体。 - `if`:条件分支语句。 - `register`:...

    SCM.zip排课问题

    `synchronized public static Session getSession()`这个方法可能是一个获取数据库连接或管理会话的函数,其中的`synchronized`关键字确保了多线程环境下的安全性,防止并发访问时出现的数据不一致问题。 `Struts`...

Global site tag (gtag.js) - Google Analytics