当前位置: 代码迷 >> Web前端 >> 关于 Java static 的小结
  详细解决方案

关于 Java static 的小结

热度:855   发布时间:2012-06-29 15:48:46.0
关于 Java static 的总结
static关键字

关于static关键字的用途有在google上找的,有自己的体会的,在这里做一下汇总。

        static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块。

StaticOne.java

public class StaticOne {
	static int i = 1; //定义一个静态变量i
	int j = 1; //定一个变量j
	//定义一个静态方法
	static void doSomeThing() {

		System.out.println(++i);

	}
    //定义一个static代码块
    static {
        int k = 1;
        System.out.println(++k);
    }

}



          当声明一个事务是static时,就意味着这个域或方法不会与包含它的那个类的任何对象实例联系在一起。所以,即使从未创建某个类的任何对象,也能访问static域。非static域或者方法必须知道它们一起运作的特定对象。

          static前面可以加上访问权限关键字如public、private。来限定该成员变量或者成员方法在其它类的访问范围。

          static修饰的成员变量和成员方法习惯上称为静态变量和静态方法,可以直接通过类名来访问,其语法为:
类名.静态方法名(参数列表)
类名.静态变量名

         一、static变量
          按照是否是静态的对类的成员变量来分,可分为两类,一是静态成员变量又叫类变量、二是实例变量。两者的区别,静态成员变量在类被加载的时候就在内存中分配好了一块自己独立的位置(这个位置是始终存在的)可以通过类名来调用,也可以通过对象调用,但是通过对象调用不推荐。而实例变量是每创建一次就被分配一次内存空间,必须使用对象调用,当不用时自动被垃圾回收机制回收。
         二、static方法
          静态方法可以通过类名直接调用,任何的实例也都可以调用,因此静态方法中不能用this和super关键字。静态方法不用调用类中的任何实例变量和实例方法,只能访问静态变量和静态方法。因为实例变量和实例方法是和对象有关系的。
         三、static代码块
          静态代码块可以在类的任何位置,数量不限。如果静态代码块有多个JVM会按照顺序执行它们。每个代码块只会被执行一次,并在内存中占有一席之地。

          静态的优缺点:
          静态的优点:常驻内存执行效率快,显而易见。
          静态的缺点:占用的内存不会释放。
          所以一般用到static关键字的地方都是常用的,比如说工具类,公共方法等。总之就是常用的地方。


Float.java

public class Float {
	//定义一个静态变量
	static float f;
	float fl;
}



Test.java


public class Test {

	/**
	 * @author 张博
	 * @time Jun 14, 2012	
	 * @param args 
	 */
	public static void main(String[] args) {
//		为Float分别创建两个对象
		Float float1 = new Float();
		Float float2 = new Float();
//		分别为静态成员变量赋值(static)
		float1.f = 1.5f;
		float2.f = 2.5f;
//		由于静态变量只是在堆中分配一块属于自己的空间 因此不同的对象都指向同一个地方,所以值是唯一的
		System.out.println("float1.f = "+float1.f);
		System.out.println("float2.f = "+float2.f);
//		静态变量又叫类变量可以用类名直接访问 Float.f = 1.1f; ,
//		用对象名访问是不推荐的,为了演示方便在例子里就用对象名代替了
		float1.f = float2.f;
		
		System.out.println("float1.f = "+float1.f);
		System.out.println("float2.f = "+float2.f);
		
		float1.f = 0.5f;
		
		System.out.println("float1.f = "+float1.f);
		System.out.println("float2.f = "+float2.f);

		System.out.println("=============悲催的分割线===============");
//		用对象调用非静态变量(实例变量)
		float1.fl = 1.5f;
		float2.fl = 2.5f;
		
		System.out.println("float1.fl = "+float1.fl);
		System.out.println("float2.fl = "+float2.fl);
		
		float1.fl = float2.fl;
		
		System.out.println("float1.fl = "+float1.fl);
		System.out.println("float2.fl = "+float2.fl);
		
		float1.fl = 0.5f;
		
		System.out.println("float1.fl = "+float1.fl);
		System.out.println("float2.fl = "+float2.fl);
		
	}

}




结果为:
float1.f = 2.5
float2.f = 2.5
float1.f = 2.5
float2.f = 2.5
float1.f = 0.5
float2.f = 0.5
=============悲催的分割线===============
float1.fl = 1.5
float2.fl = 2.5
float1.fl = 2.5
float2.fl = 2.5
float1.fl = 0.5
float2.fl = 2.5
  相关解决方案