疯狂java


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

Java中static的特点和应用


 

   

  我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,有时候,我们希望该类的所有成员共享一个成员。这时可以用static来修饰。

  Java中static作为修饰符,可以用来修饰变量、方法、代码块。

  1、静态方法

  被static修饰的变量成为静态变量,又可以成为静态成员或类成员。它属于整个类所有,而不是某个对象所有,被类的所有对象共享。类变量在类加载的时候初始化分配空间,而且只被初始化一次,直到该类被卸载时才将资源回收。

  静态成员可以使用类名直接访问,也可以使用对象进行访问。在程序中任何对象对静态变量做修改,

  其它对象看到的是修改后的值。

  public class Test {

  static String play="football";

  public static void main(String[] args) {

  System.out.println("通过类访问静态变量,"+play);

  Test test=new Test();

  System.out.println("通过对象访问静态变量,"+test.play);

  test.play="basketball";

  System.out.println("通过对象访问静态变量,"+test.play);

  }

  }

  2、静态方法

  用static修饰的方法,称为静态方法或类方法,经常用到的main方法就是静态方法。

  静态方法中可以直接调用同类中的静态变量,但不能直接调用非静态变量,可以通过创建对象后访问非静态变量;静态方法中不能直接调用非静态方法,可以通过对象来访问非静态方法。

  public class Test {

  String game="DOTA";

  static String play="football";

  public static void main(String[] args) {

  print();

  }

  public static void print(){

  System.out.println("访问静态变量,"+play);

  // System.out.println("访问非静态变量,"+game); //静态方法不能直接访问非静态变量

  Test test=new Test();

  System.out.println("访问非静态变量,"+test.game);

  // show();//静态方法不能直接调用非静态方法

  test.show();

  }

  //普通方法中,可以直接访问同类的非静态变量和静态变量

  public void show(){

  System.out.println("访问静态变量,"+play);

  System.out.println("访问非静态变量,"+game);

  print();//普通方法可以直接调用静态方法

  }

  }

  3、代码块

  用static去修饰类里面的一个独立的代码块,称为静态代码块。

  静态初始化块只在类加载时执行,且只会执行一次,静态代码块没有名字,不能显示调用,只能在类加载的时候调用。

  静态初始化块只能给静态变量赋值,不能初始化普通成员变量。

  public class Test{

  String film;

  String game;

  static String play;

  public static void main(String[] args) {

  Test test=new Test();

  System.out.println("film="+test.film);

  System.out.println("game="+test.game);

  System.out.println("play="+play);

  Test test2=new Test();

  }

  public Test(){

  film="爱奇艺";

  System.out.println("通过构造方法赋值 film");

  }

  {

  game="DOTA";

  System.out.println("通过初始化块赋值 game");

  }

  static {

  play="football";

  // game="DOTA";//不能赋值

  System.out.println("通过静态初始化块赋值 play");

  }

  }

  输出结果:

  通过静态初始化块赋值 play

  通过初始化块赋值 game

  通过构造方法赋值 film

  film=爱奇艺

  game=DOTA

  play=football

  通过初始化块赋值 game

  通过构造方法赋值 film