A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周志龙 中级黑马   /  2013-10-11 18:23  /  1188 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

static ['stætɪk]
n. 静电;静电干扰
adj. 静态的;静电的;静力的
在计算机上我们译为:静态的。在Java种根据它修饰对象不同,我们可以划分为
1. static对象
2. static方法
3. static语句块
TAG:static对象和static方法都属于类的成员,他们不属于类的任何实例,被所有实例共享。static语句块又叫“静态代码块”,当JVM加载类时会自动执行static语句中的代码。
现在我们挨个分析一下这三种不同的情况:
1. static对象​
根据是否由static修饰,对象分为:静态变量和实例变量。
对于静态变量,在JVM加载类的时候就为它分配内存,是第一次也是唯一一次对它分配内存部;而实例变量在类每次实例化的时候都会为它分配内存。
用途:好像太低端了点,就不举栗子了。
2. static方法
当一个方法被static修饰,那么它就属于整个类而不是类的实例了,所以它不能使用this或者super关键字,也不能使用类的非static对象和方法。
再者就是,static方法不能是抽象的(不能被abstract修饰),因为他不属于任何实例所以必须是已经实现的。
用途:
举个栗子:Java里面有个Math类,Math类里面有很多算数方法,如min()。它的某个原型是:
[java]  
static int max(int i1, int i2);  
如果min不是static方法,那么原型则是:
[java
int max(int i1, int i2);  
非static方法实现策略:
[java]  
Math math=new Math();  
int min=math.min(i1,i2);  
而static方法实现的策略是:
[java]  
int min=Math.min(i1,i2);  
看到问题所在了么?不仅是减少了代码量,更重要的是,我们节约了内存开销,所以Math下面的方法都是static的。
3. static语句块
static语句块,即static{},是用static修饰的一段代码块。static{}会在类被加载的时候执行且仅会被执行一次。一个类中可以可以有很多static块。static块按定义的顺序执行。
这里要注意的是:static{}是在类被加载而不是函数被调用的时候执行,这里我在http://blog.csdn.net/newjerryj/article/details/8650268这篇博客上看到了一个很好的例子。下面我们就看看这个例子。
[java]
public class TestStatic{  
    static{  
        System.out.println(1);  
    }  
    static {  
        System.out.println(2);  
    }  
    static {  
        System.out.println(3);  
    }  
    public static void main(String args[]){  
        System.out.println(5);  
    }  
    static {  
        System.out.println(4);  
    }  
}  
结果是什么呢?
是5,1,2,3,4么?No!
结果是:1,2,3,4,5。
这个栗子很好的说明了static{}语句执行的时机。
那么static{}有什么用途呢,还是举个栗子。大家都知道Java连接数据库的一个技术——JDBC。如果不了解的自行百度一下。我们总喜欢封装一个类去实现和数据库的交互(这里我假设使用Mysql)。那么我们怎么做呢?
[java]  
public class JDBCHelper  
{  
    private Connection con = null;  
    private Statement stmt = null;  
    public JDBCHelper()  
    {  
        String user = "root";  
        String password = "123456";  
        String url = "jdbc:mysql://localhost:3306/mydb";  
        String driver = "com.mysql.jdbc.Driver";  
        try  
        {  
            Class.forName(driver);  
            con = DriverManager.getConnection(url, user, password);  
            stmt = con.createStatement();  
        }  
        catch(Exception e)  
        {  
            e.printStackTrace();  
        }  
    }  
    public ResultSet executeQuery(String sql)  
    {  
        //......  
    }  
}  

差不多就是这样,可是问题是,每次执行sql的时候可能会实例化一个JDBCHelper,这样明显是不好的,改成static块的方式。
[java
public class JDBCHelper  
{  
    private static Connection con = null;  
    private static Statement stmt = null;  
    private static String user = "root";  
    private static String password = "123456";  
    private static String url = "jdbc:mysql://localhost:3306/mydb";  
    private static String driver = "com.mysql.jdbc.Driver";  
    static  
    {  
        try  
            {  
                Class.forName(driver);  
                con = DriverManager.getConnection(url, user, password);  
                stmt = con.createStatement();  
            }  
            catch(Exception e)  
            {  
                e.printStackTrace();  
            }  
    }  
    public JDBCHelper()  
    {  
        //其实什么都没干  
    }  
    public ResultSet executeQuery(String sql)  
    {  
        //......  
    }  
}  

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马