Java的static详解
static ['stætɪk]
n. 静电;静电干扰
adj. 静态的;静电的;静力的
1. static对象
2. static方法
3. 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详解的更多相关文章
- 9、java中static详解
一.static关键字的用途 在<Java编程思想>P86页有这样一段话: “static方法就是没有this的方法.在static方法内部不能调用非静态方法,反过来是可以的.而且可以在没 ...
- Java 字符串格式化详解
Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...
- Java 序列化Serializable详解
Java 序列化Serializable详解(附详细例子) Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连 ...
- Java String类详解
Java String类详解 Java字符串类(java.lang.String)是Java中使用最多的类,也是最为特殊的一个类,很多时候,我们对它既熟悉又陌生. 类结构: public final ...
- 最新java数组的详解
java中HashMap详解 http://alex09.iteye.com/blog/539545 总结: 1.就像引用类型的数组一样,当我们把 Java 对象放入数组之时,并不是真正的把 Java ...
- 转:Java HashMap实现详解
Java HashMap实现详解 转:http://beyond99.blog.51cto.com/1469451/429789 1. HashMap概述: HashMap是基于哈希表的M ...
- 【转】 java中HashMap详解
原文网址:http://blog.csdn.net/caihaijiang/article/details/6280251 java中HashMap详解 HashMap 和 HashSet 是 Jav ...
- JAVA命令参数详解
JAVA命令参数详解 JAVA命令详解 结构 说明 Java 和 OldJava JIT 选项 另请参阅 结构 java [ options ] class [ argument ... ] java ...
- Java 序列化Serializable详解(附详细例子)
Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization ...
随机推荐
- OC语法7——内存管理之@property参数
@property的参数: 我们已经知道为了给开发者提供便捷,OC提供了@porperty关键字,它可以自动生成属性的set和get方法. 但是我们又知道,在OC中还面临者对象内存管理的问题,而且我们 ...
- day9_python学习笔记_chapter12_模块
1. 名称空间加载顺序: 首先加载内建名称空间,他由__builtin模块中的名字构成.然后加载执行模块的全局名称空间,他会在模块开始执行后变为活动名称空间.如 果在执行期间调用了一个函数,那么将创建 ...
- Oracle EBS-SQL (SYS-21):sys_用户名与人员对应关系查询.sql
select fu.user_name 用户名, fu.description 描述, (select ppf.FULL_NAME ...
- 解密电子书之四:MCU(freescale)
谈完国产的君正,让我们再看看呛了君正财路的freescale iMX51. 这是freescale近期的主打产品,用的是ARM Cortex A8架构,主频在消费电子领域最高可达800MHz,在工业领 ...
- poj1528---(数论)
题意:一个数除了自身以外的所有因数相加,得到的数如果小于自身,输出deficient,否则输出abundant,如果相等,输出perfect 这道题核心:求一个数的所有除本身之外的因数的和 ,i; ; ...
- 【POJ】2528 Mayor's posters ——离散化+线段树
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Description The citizens of Bytetown, A ...
- 在VirtualBox虚拟机上采集Fedora15系统
在VirtualBox虚拟机上采集Fedora15系统 第一部分:创建系统并磁盘分区 1.点击VirtualBox上的新建 2.添加名称,选择类型和版本,点下一步 3.写入内存(不要超过物理内存),点 ...
- openvswitch常用操作
原理讲解: 当我们创建一个交换机(网桥)之后即(ovs-vsctl add-br brname),此时网络功能不受影响,但是会产生一个虚拟网卡,名字为brname(与网桥名字同名,可以使用 ifcon ...
- 通过 CsvListWriter 读写.csv文件辅助类
package cn.gov.cnis.db; import java.io.File; import java.io.FileReader; import java.io.FileWriter; i ...
- .NET平台和C#语言
.NET平台的作用C#语言通过.NET平台来编写 部署 运行.NET应用程序. 为什么学习.NET语言1. C#语言是为.NET平台而生的.2. C#语言是完全面向对象的语言,所以一般情况下我们用C# ...