static,意為靜態的,是一個狀態修飾符。
1.修飾變量
static修飾的變量稱為靜態變量,可以使用類名.變量名直接調用,並且該變量只存在一份,被所有的實例共享。
(1)類名.變量名調用靜態變量:
例:
package com.dh.oop;
public class StaticField {
public static int num = 1;
}
package com.dh.oop;
public class StaticFieldApplication {
public static void main(String[] args) {
//類名調用
System.out.println(StaticField.num);
}
}
(2)靜態變量只存在一份,被所有的實例共享:
例:
package com.dh.oop;
public class StaticField {
public static int num = 1;
}
package com.dh.oop;
public class StaticFieldApplication {
public static void main(String[] args) {
//實例化兩個變量,並分別為num賦值
StaticField staticField1 = new StaticField();
staticField1.num = 2;
StaticField staticField2 = new StaticField();
staticField2.num = 3;
System.out.println(staticField1.num);
System.out.println(staticField2.num);
}
}
通過以上代碼,若所有實例共享一份靜態變量的話,輸出的值應該都為3,否則,為2,3
可以看到,結果為兩個3,由此可證,所有實例共享一份靜態變量。
2.修飾方法
被static修飾的方法稱為靜態方法。可以被類名直接調用;靜態方法中只能直接使用靜態屬性和調用靜態方法,若是非靜態屬性和非靜態方法的的話只能通過對象調用。
(即:在非靜態方法中,既可以使用靜態變量和靜態方法,也可以使用非靜態變量和非靜態方法。但是在靜態方法中,只能直接使用靜態變量和靜態方法,若想使用非靜態的變量和非靜態的方法,就需要借助對象。)
(1)類名.方法名調用靜態方法:
例:
public int num;
public static int num1;
public void show(){
System.out.println("非靜態show方法");
}
}
package com.dh.oop;
public class StaticMethodApplication {
public static void main(String[] args) {
StaticMethod.show();
}
}
(2)靜態方法中調用靜態屬性、靜態方法和非靜態屬性、靜態方法:
例:
package com.dh.oop;
public class StaticMethod {
public static int num;
public int num1;
public static void show(){
System.out.println("靜態show方法");
}
public void show1(){
System.out.println("非靜態show方法");
}
public static void main(String[] args) {
//1.靜態方法中調用靜態屬性和靜態方法
//(1)直接使用類名調用
StaticMethod.num = 1;
StaticMethod.show();
//(2)使用對象調用
StaticMethod staticMethod = new StaticMethod();
staticMethod.num = 2;
staticMethod.show();
//(3)若是在本類的方法中,還能直接使用,其它類中就不可以使用此種方法
num = 3;
show();
//2.靜態方法中調用非靜態屬性和非靜態方法
//使用對象調用
staticMethod.num1 = 1;
staticMethod.show1();
}
}
(3)非靜態方法中調用靜態屬性、靜態方法和非靜態屬性、靜態方法:
例:
package com.dh.oop;
public class StaticMethod {
public static int num;
public int num1;
public static void show(){
System.out.println("靜態show方法");
}
public void show1(){
System.out.println("非靜態show方法");
}
public void test(){
//1.非靜態方法中調用靜態屬性和靜態方法
//(1)在本類中,可以直接使用
num = 1;
show();
//(2)直接使用類名調用
StaticMethod.num = 2;
StaticMethod.show();
//(3)使用對象調用
StaticMethod staticMethod = new StaticMethod();
staticMethod.num = 2;
staticMethod.show();
//2.非靜態方法中調用非靜態屬性和非靜態方法
//(1)在本類中,可以直接使用
num1 = 1;
show1();
//(2)直接使用類名調用
staticMethod.num1 = 2;
staticMethod.show1();
}
public static void main(String[] args) {
StaticMethod staticMethod = new StaticMethod();
staticMethod.test();
}
}
所以可以看出,只要使用對象的話就相當於沒有限制了;如果是static修飾的話,使用類名調用就不需要創建對象了。
(4)擴展:在static修飾的方法中不能出現this和super(之后會講解super)。
3.修飾代碼塊
我們之前說過,在類體中是不允許直接出現可執行語句的,像流程控制、賦值、打印等語句,但是只要我們將其放在{},即代碼塊中就沒有問題了。
代碼塊語法:類體中
{
//語句
};
(分號可加可不加)
例:
package com.dh.oop;
public class CodeBlock {
{
int a;
a = 10;
if(a == 10){
System.out.println("a為10");
}
System.out.println("這是代碼塊");
}
public static void main(String[] args) {
CodeBlock codeBlock = new CodeBlock();
}
}
注意:需要注意的是必須要new對象的時候代碼塊才會執行,沒有new對象的時候是不會執行的。
用static修飾的代碼塊叫靜態代碼塊。
代碼塊語法:類體中
static{
//語句
};
(分號可加可不加)
例:
package com.dh.oop;
public class StaticCodeBlock {
static {
int b;
b = 100;
if(b == 100){
System.out.println("a為100");
}
System.out.println("這是靜態代碼塊");
}
public static void main(String[] args) {
}
}
注意:static修飾的代碼塊,不需要new對象也可以運行。當然,new對象的時候也是會執行的。我們可以利用靜態代碼塊來執行一些加載類就需要完成初始化且只需要初始化一次的內容。
4.代碼塊、靜態代碼塊、構造方法的執行順序
構造方法是在new對象的時候被調用的,現在說靜態代碼塊和代碼塊也會在new操作時運行,那它們的執行順序是什么呢?我們來試驗一下:
package com.dh.oop;
public class Test {
//代碼塊
{
System.out.println("代碼塊");
}
//靜態代碼塊
static {
System.out.println("靜態代碼塊");
}
//構造方法
public Test() {
System.out.println("構造方法");
}
public static void main(String[] args) {
Test test = new Test();
System.out.println("====================");
Test test1 = new Test();
}
}
我們來看看結果:
可以看到,執行順序為:靜態代碼塊 > 代碼塊 > 構造方法
並且,靜態代碼塊只執行一次!在第一次執行代碼的時候,不管有沒有new對象,而代碼塊和構造方法則在new對象就會執行,new幾個對象就執行幾次。
本人水平有限,若有錯誤,請指出,感激~