1、静态变量
对于在类中用static修饰的静态变量(例如:static String str;),只要有两个特性:
1、无需实例化对象,可以直接调用:
public class Test2 {
String str1 = "aaa";
static String str2 = "bbb";
public static void main(String[] args)
{
//如果不是静态变量,这样访问:
String str1 = new Test2().str1; //需要实例化
//对于静态变量 str2:
String str2 = Test2.str2; //无需实例化 Test2
}
}
2、静态变量为对象中 “共享” 的变量,在编译时由系统分配一块内存空间,直到程序停止运行才会释放(这也是为什么可以通不进行实例化而可以直接调用),对于同一类的几个不同的实例化对象,类中的静态变量对每个实例化对象都是相同的:
public class Test2 {
static String str2 = "初始化";
public Test2() {
str2 = "无参构造";
}
public Test2(String str2) {
this.str2 = str2;
}
public static void main(String[] args)
{
Test2 test2_1 = new Test2();
Test2 test2_2 = new Test2("带参构造");
System.out.println(test2_1.str2+" "+test2_2.str2);
}
}
main 函数输出结果为: 带参构造 带参构造
可见,静态变量对所有的实例化对象都是相同的,以最后一次修改为结果。
2、静态方法
对于类中的静态方法,最大的优点依然是无需实例化对象,可以通过 “类名”+ “ . ” + “方法” 来调用(还是因为系统会为静态方法分配一个固定的内存空间)。要知道,创建一个对象是极其耗费资源的。。。。
此外,静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制。
3、静态代码块
基本语法:
static
{
//此处写代码
}
当一个类中定义了 静态代码块,当类被第一次加载到内存中,静态代码块会被自动执行一次(无需调用),以后再也不会执行。拿一个很实际的例子来说,在进行 JDBC 编程,连接数据库时,获取资源文件解析器对象(ResourceBundle)以及加载驱动(Class.forName(driver)) 的操作都是很耗时的,但是也只是需要执行一次即可,那么就可以写到静态代码块中:
//描述在mysql驱动jar包中,核心类是哪个,其完整路径是什么样的----驱动串
private static String driver=null;
//描述数据库所在的位置,数据库的名称--- 连接串
private static String url=null;
//用户名
private static String userName=null;
//密码
private static String password=null;
static
{
try
{
System.out.println("linklinklink");
//获取资源文件解析器对象
ResourceBundle bundle=ResourceBundle.getBundle("DBOptions");
//通过解析器对象,从资源文件,获取相关信息
/*
* driver,url,userName,password 都是开头定义的静态变量,从文件中读取其信息
*/
driver=bundle.getString("DRIVER");
url=bundle.getString("URL");
userName=bundle.getString("USERNAME");
password=bundle.getString("PASSWORD");
//加载驱动 --- new com.mysql.jdbc.Driver()
Class.forName(driver);
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
}
这样,会节省很多因为重复操作造成的资源浪费!!
4、静态类
静态类一般又叫 “静态内部类” , 可以看出,他是一个嵌套类。不予许在外部类用static 修饰,编译不会通过。
主要对比下 静态内部类 与 普通内部类 的区别:
内部类: 内部类拥有普通类的所有特性 。内部类可以访问其外部类的成员变量,属性,方法,其它内部类
静态内部类:
1、只有静态内部类才能拥有静态成员,普通内部类只能定义普通成员
2、静态类跟静态方法一样,只能访问其外部类的静态成员
3、如果在外部类的静态方法中访问内部类,这时候只能访问静态内部类
总的来说,静态的产生,还是为了提高开发效率,避免不必要的重复操作也资源消耗,例如定义的静态变量,有一天要换一个值,不必把所有调用他的地方都换一遍,换一个地方便 “牵一发而动全身” 了。
如有不当之处,请谅解并欢迎批评指正,不甚感激。