被static修飾的類、方法等都是靜態的,也就是不依賴實例進行創建,在類被第一次訪問的時候就加載了。static出現的地方以及所起的作用大概有五種:
1. 修飾靜態屬性;
2. 修飾靜態方法;
3. 修飾靜態內部類;
4. 靜態導包(類或者方法,可以通配);
5. 標記靜態代碼塊。
我們用一個demo來測試一下。
建一個普通的java項目,建立一個包com.chris.demo.statictest
1. 創建一個工具類MyUtils,工具類一般放置我們封裝好的一般邏輯,方便我們使用,對於使用率比較高的,我們不需要依賴於實例,所以使用靜態方法。
package com.chris.demo.statictest;
import static java.lang.System.out;
/**
* 模擬工具類
* 工具類使用率較高的方法一般使用靜態方法
*/
public class MyUtils {
//靜態方法
public static void log(Object object) {
out.println(object);
}
}
可以看出我們在這個類裏面已經使用了靜態導包,靜態導包的好處就是可以直接使用對象或者方法,不用再依賴於對象對象或者類來調用,如:原來經常使用的System.out.println("Hello,World!");現在就變成out.println("Hello,World!");了。
2. 創建一個類MyClass,包含一個普通的內部類,一個靜態內部類,和一個靜態內部對象,還有普通方法和靜態方法。
package com.chris.demo.statictest;
import static com.chris.demo.statictest.MyUtils.log;
/**
* 模擬一個複雜的類
* 其中包含一個普通內部類和一個靜態內部類
* 靜態內部類包含普通方法和靜態方法
* 還有一個靜態內部對象
* 類的實例化和方法的調用各不相同
*/
public class MyClass {
public static MyStaticInnerClass cls = new MyStaticInnerClass();
class MyInnerClass {
public void show() {
log("普通內部類實例 普通方法");
}
}
static class MyStaticInnerClass {
public void show() {
log("靜態內部類實例 普通方法");
}
public static void showInfo() {
log("靜態內部類或實例 靜態方法");
}
}
}
在這個類裏面我們調用了剛纔創建的工具類,使用靜態導包,直接導入方法,使用的時候不用指定類,直接使用方法。不過也只有靜態方法可以這樣。
3. 最後我們創建一個測試類StaticTest,來查看效果:
package com.chris.demo.statictest;
import static com.chris.demo.statictest.MyUtils.log;
import static java.lang.System.out;
/*
修飾符static的作用總結起來大概有五種:
1. 修飾靜態屬性;
2. 修飾靜態方法;
3. 修飾靜態內部類;
4. 靜態導包(類或者方法,可以通配);
5. 標記靜態代碼塊。
*/
public class StaticTest {
private static String msg;
static {
msg = "在靜態代碼塊中給靜態屬性賦值";
}
public static void main(String[] args) {
test1();
}
private static void test1() {
out.println("靜態導包");
}
private static void test2() {
log("導入靜態方法");
}
private static void test3() {
log(msg);
}
private static void test4() {
//普通內部類的實例化
MyClass myClass = new MyClass();
MyClass.MyInnerClass innerClass1 = myClass.new MyInnerClass();
//MyClass.MyInnerClass innerClass2 = (new MyClass()).new MyInnerClass();
innerClass1.show();
//靜態內部類的實例化
MyClass.MyStaticInnerClass staticInnerClass = new MyClass.MyStaticInnerClass();
//靜態內部類實例的普通方法
staticInnerClass.show();
staticInnerClass.showInfo();
//靜態內部類的靜態方法
MyClass.MyStaticInnerClass.showInfo();
//靜態成員的方法調用,類似System.out.println("Hello,World!");
MyClass.cls.show();
}
}
五種作用都包含其中,很容易看到效果。