疯狂java


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

Java基础static的用法讲解实践


 

   

  之前文章说过Java中static的作用,有朋友想看个例子。于是便抽空写了个小栗子

  代码

  package xing.test.thinking.chap5;

  class A{

  public A() {

  System.out.println("A constructor");

  }

  }

  class VarTest{

  static A a = new A();

  public static int b = 0;

  public int c = 0;

  static{

  System.out.println("VarTest static");

  }

  public VarTest() {

  System.out.println("VarTest constructor");

  }

  public static void test(){

  System.out.println("in static test func");

  }

  }

  public class StaticTest {

  public static void main(String[] args) {

  System.out.println("start testing!");

  System.out.println("如果不new VarTest或者使用VarTest的静态内容,就不会触发VarTest静态块的执行");

  try {

  Thread.sleep(5000);

  } catch (InterruptedException e) {

  e.printStackTrace();

  }

  VarTest.test();//也会触发静态块的执行

  VarTest testa = new VarTest();

  VarTest testb = new VarTest();

  System.out.println("testa.b: "+testa.b);

  System.out.println("testb.b: "+testb.b);

  System.out.println("testa.c: "+testa.c);

  System.out.println("testb.c: "+testb.c);

  //如果修改b属性的值,所有对象的内容都会改变

  testa.b = 3;

  System.out.println("testa.b: "+testa.b);

  System.out.println("testb.b: "+testb.b);

  }

  }

  执行结果

  start testing!

  如果不new VarTest或者使用VarTest的静态内容,就不会触发VarTest静态块的执行

  A constructor

  VarTest static

  in static test func

  VarTest constructor

  VarTest constructor

  testa.b: 0

  testb.b: 0

  testa.c: 0

  testb.c: 0

  testa.b: 3

  testb.b: 3

  static修饰的变量

  首先先来说说静态修饰的变量,使用static修饰的变量会有两个效果:

  第一,就是可以通过类直接访问这个对象,而不需要创建对象

  第二,就是所有的创建的对象,都指向同一份对象,也就是这个静态对象是所有的类对象共享的。因此修改它的值,相当于修改了所有对象的变量。

  应用场景

  通常用于存储类公用的属性,如logger。

  static修饰的方法

  静态修饰的方法,可以直接通过类来使用。如上面的VarTest的test方法,直接基于Class就可以访问。

  应用场景

  通常用于编写工具类方法,如FileUtil、BeanUtil等。

  static块

  static另一个应用场景就是写静态块,如上面的static{}。这部分静态块会在第一次加载使用类的时候执行一次,仅仅会执行一次!

  加载的方式有两种,一种是new对象;另一种就是访问类的静态内容。

  如上面的例子中,就是访问了类的静态方法。

  应用场景

  这种静态块一般用于某些线程池或者连接池的初始化,比如JDBC连接池。

  关于属性的初始化

  在Java中都是属性先进行初始化,然后再执行构造器方法!