疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

java中static 的用法


 

  static静态修饰符,什么叫静态修饰符呢?

  大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个空间,也就是只要程序在运行,那么这块内存就会一直存在。这样做有什么意义呢? 在Java程序里面,所有的东西都是对象,而对象的抽象就是类,对于一个类而言,如果要使用他的成员,那么普通情况下必须先实例化对象后,通过对象的引用才能够访问这些成员,但是有种情况例外,就是该成员是用static声明的(在这里所讲排除了类的访问控制),例如:

  未声明为static

  class ClassA{

  int b;

  public void ex1(){

  … }

  }

  class ClassB{

  void ex2{ int i;

  ClassA a = new ClassA();

  i = a.b; //这里通过对象引用访问成员变量b

  a.ex1; //这里通过对象引用访问成员函数ex1 } }

  声明为static

  class ClassA{

  static int b;

  static void ex1(){ … }

  }

  class ClassB{

  void ex2{

  int i;

  i = ClassA.b;//这里通过类名访问成员变量b

  ClassA.ex1; //这里通过类名访问成员函数ex1

  }

  }

  通过以上两种比较,就可以知道static用来修饰类成员的主要作用了,在java类库当中有很多类成员都声明为static,可以让用户不需要实例化对象就可以引用成员,

  最基本的有Integer.parseInt(),Float.parseFloat()等等用来把对象转换为所需要的基本数据类型。

  这样的变量和方法我们又叫做类变量和类方法。

  static修饰后的变量的值,被static修饰后的成员,在编译时由内存分配一块内存空间,直到程序停止运行才会释放,那么就是说该类的所有对象都会共享这块内存空间, 看一下下面这个例子:

  class TStatic{

  static int i;

  public TStatic(){ i = 4; }

  public TStatic(int j){ i = j; }

  public static void main(String args[]){

  TStatic t = new TStatic(5); //声明对象引用,并实例化

  TStatic tt = new TStatic(); //同上

  System.out.println(t.i);

  System.out.println(tt.i);

  System.out.println(t.i);

  }

  }

  这段代码里面Tstatic类有一个static的int变量I,有两个构造函数,第一个用于初始化I为4,第二个用于初始化i为传进函数的值,在main中所传的值是5,程序首先声明对象的引用t,然后调用带参数的构造函数实例化对象,此时对象t的成员变量I的值为5,接着声明对象tt,调用无参数的构造函数,那么就把对象tt的成员变量i的值初始化为4了,注意了,在这里i是static,那就是说该类的所有对象都共享该内存,那也就是说在实例化对象tt的时候改变了i的值,那么实际上对象t的i值也变了,因为实际上他们引用的是同一个成员变量。最后打印的结果是三个4。呵呵,写到这里大家是否明白了呢?不明白就再看看书或者多写几个例子印证一下,呵呵。

  转自:http://wenda.so.com/q/1373937231061360?src=140

  Static 静态:这里主要记录的是静态程序块和静态方法

  如果有些代码必须在项目启动的时候就执行,就需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化但是不执行,在不创建对象的情况下,可以供其他程序调用,而在调用的时候才执行,这需要使用静态方法,这种代码是被动执行的. 静态方法在类加载的时候 就已经加载 可以用类名直接调用。

  静态代码块和静态方法的区别是:

  静态代码块是自动执行的;

  静态方法是被调用的时候才执行的.

  静态方法:如果我们在程序编写的时候需要一个不实例化对象就可以调用的方法,我们就可以使用静态方法,具体实现是在方法前面加上static,如下:

  public static void method(){}

  在使用静态方法的时候需要注意一下几个方面:

  在静态方法里只能直接调用同类中其他的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。这是因为,对于非静态的方法和变量,需要先创建类的实例对象后才可使用,而静态方法在使用前不用创建任何对象。(备注:静态变量是属于整个类的变量而不是属于某个对象的)

  静态程序块:当一个类需要在被载入时就执行一段程序,这样可以使用静态程序块。

  :java中类的装载步骤:

  在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下:

  所谓装载就是寻找一个类或是一个接口的二进制形式并用该二进制形式来构造代表这个类或是这个接口的class对象的过程。其中类或接口的名称是给定了的。

  装载:查找和导入类或接口的二进制数据;

  链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;

  校验:检查导入类或接口的二进制数据的正确性;

  准备:给类的静态变量分配并初始化存储空间;

  解析:将符号引用转成直接引用;

  初始化:激活类的静态变量的初始化Java代码和静态Java代码块

  public class DemoClass {

  private DemoClass(){}

  public static DemoClass _instance;

  static{

  if(null == _instance ){

  _instance = new DemoClass();

  }

  }

  public static DemoClass getInstance(){

  return _instance;

  }

  }

  这样的程序在类被加载的时候就执行了static中的代码。