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

如果文中有任何错误,欢迎指出。

Java的static详解的更多相关文章

  1. 9、java中static详解

    一.static关键字的用途 在<Java编程思想>P86页有这样一段话: “static方法就是没有this的方法.在static方法内部不能调用非静态方法,反过来是可以的.而且可以在没 ...

  2. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

  3. Java 序列化Serializable详解

    Java 序列化Serializable详解(附详细例子) Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连 ...

  4. Java String类详解

    Java String类详解 Java字符串类(java.lang.String)是Java中使用最多的类,也是最为特殊的一个类,很多时候,我们对它既熟悉又陌生. 类结构: public final ...

  5. 最新java数组的详解

    java中HashMap详解 http://alex09.iteye.com/blog/539545 总结: 1.就像引用类型的数组一样,当我们把 Java 对象放入数组之时,并不是真正的把 Java ...

  6. 转:Java HashMap实现详解

    Java HashMap实现详解 转:http://beyond99.blog.51cto.com/1469451/429789 1.    HashMap概述:    HashMap是基于哈希表的M ...

  7. 【转】 java中HashMap详解

    原文网址:http://blog.csdn.net/caihaijiang/article/details/6280251 java中HashMap详解 HashMap 和 HashSet 是 Jav ...

  8. JAVA命令参数详解

    JAVA命令参数详解 JAVA命令详解 结构 说明 Java 和 OldJava JIT 选项 另请参阅 结构 java [ options ] class [ argument ... ] java ...

  9. Java 序列化Serializable详解(附详细例子)

    Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization ...

随机推荐

  1. Linux学习之chkconfig命令

    chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 使用语法:chkconfig [--ad ...

  2. jQuery报错:

    jQuery报错:Uncaught ReferenceError: $ is not defined 在使用jQuery的时候,发现有如下报错: Uncaught ReferenceError: $ ...

  3. project euler 48 Self powers 解决乘法爆long long

    题目链接 求 $ 1^1+2^2+\cdots + 1000^{1000} $ %1e10 的结果. 唯一的坑点是会爆longlong, 所以用特殊的乘法. #include <iostream ...

  4. Android SQLiteDatabase使用总结

    SQLiteDatabase数据库操作 1.创建一个继承了类SQLiteOPenHelper类复写相应的方法,和构造函数 2.然后创建一个类,定义一个私有变量(上述类的实例化对象),在构造函数中进行初 ...

  5. Oracle EBS-SQL (GL-2):从总帐追溯到库存

    SELECT je_header_id,je_line_num,trx_class_name, trx_type_name, trx_number_displayed, trx_date, comme ...

  6. 一个不错的文章-【原创】2014年信息安全产品及厂家分类-SOC&SIEM安全厂家 | Srxh1314

    转载:http://www.srxh1314.com/2014-sec-company-soc-siem.html http://www.bugsec.org/1598.html http://www ...

  7. 第三届蓝桥杯预赛真题_第一题_两种微生物 X 和 Y

    /* 假设有两种微生物 X 和 Y X出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍). 一个新出生的X,半分钟之后吃掉1个Y,并且,从此开始,每隔1分钟吃1个Y. 现在已 ...

  8. linux 磁盘空间扩容 vg(+pv) lv(+空间) lv(缩减磁盘空间)

    preFace APP scenario description: 当你未能合理的规划存储时,在后期的维护工作中可能会涉及的存储的 再规划(eg,某一个 or 数个App 对某一个lv 即挂载点写Bi ...

  9. sql优化-总结

    1.尽量缩小数据范围. 2.能一个sql解决的,坚决不用两条sql.利用case when或decode. select month_id, corppkno, sum(exportSum_new) ...

  10. C++与AS3

    ActionScript 3(简称AS3)与 c++ 都是面向对象的编程(OOP)语言,都具有OOP的特性如封装.继承.多态等.二者在语法上有许多相似之处,基本上学过C++之后再学习AS3感觉并不是特 ...