Java: static 修饰下的静态变量、静态方法、静态代码块、静态类

时间:2019-01-23
本文章向大家介绍Java: static 修饰下的静态变量、静态方法、静态代码块、静态类,主要包括Java: static 修饰下的静态变量、静态方法、静态代码块、静态类使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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、如果在外部类的静态方法中访问内部类,这时候只能访问静态内部类

总的来说,静态的产生,还是为了提高开发效率,避免不必要的重复操作也资源消耗,例如定义的静态变量,有一天要换一个值,不必把所有调用他的地方都换一遍,换一个地方便  “牵一发而动全身”  了。

如有不当之处,请谅解并欢迎批评指正,不甚感激。