• Java的static详解


    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()。它的某个原型是:
    static int max(int i1, int i2);
    如果min不是static方法,那么原型则是:
    int max(int i1, int i2);
    非static方法实现策略:
    Math math=new Math();
    int min=math.min(i1,i2);
    而static方法实现的策略是:
    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这篇博客上看到了一个很好的例子。下面我们就看看这个例子。
    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)。那么我们怎么做呢?
    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块的方式。
    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)
    	{
    		//......
    	}
    }
    好了,关于Java中的static就写到这了,这里有我理解static的时候在网上看到的一些博客一并贴出,供大家参考:
    http://blog.csdn.net/newjerryj/article/details/8650268
    http://www.java3z.com/cwbwebhome/article/article8/81101.html?id=2497
    http://www.cnblogs.com/panjun-Donet/archive/2010/08/10/1796209.html
    http://www.2cto.com/kf/201109/104884.html
    如果文中有任何错误,欢迎指出。
  • 相关阅读:
    如何做竞品分析报告
    软件架构入门
    系统内部矛盾的解决思路
    分表分库一
    Hbase随笔2
    Hbase随笔
    vertica在电信的应用
    理解RESTful架构
    百分点刘译璟
    数据产品的简介
  • 原文地址:https://www.cnblogs.com/james1207/p/3320339.html
Copyright © 2020-2023  润新知