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