天天看點

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中都是屬性先進行初始化,然後再執行構造器方法!