1. static修飾的類只能為內部類,普通類無法用static關鍵字修飾。static修飾的內部類相當於一個普通的類,訪問方式為(new 外部類名.內部類的方法() )。如下所示:
public class OuterClass { public static class InnerClass{ InnerClass(){ System.out.println("============= 我是一個內部類'InnerClass' ============="); } } } public class TestStaticClass { public static void main(String[] args) { // 不需要new一個InnerClass new OuterClass.InnerClass(); } }
注:普通內部類的訪問方式為 (外部類對象.new 內部類方法())
2.static修飾靜態方法的訪問方式為 (類名.方法名)
3.靜態變量和實例變量的區別
static修飾的變量為靜態變量,靜態變量在內存中只有一份存儲空間,靜態變量不屬於某個實例對象,被一個類中的所有對象所共享,屬於類,所以也叫類變量,可以直接通過類名來引用。
實例變量屬於某個固定對象所私有,實例變量的使用必須先創建一個類的實例,然后通過這個實例來引用使用。
public class Person { int age = 10; static int age1 =11; }
public class Test {
public static void main(String[] args) {
Person person = new Person();
person.age=11;
person.age1 = 12;
Person person1 = new Person();
System.out.println(person.age);
System.out.println(person.age1);
System.out.println(person1.age);
System.out.println(person1.age1);
}
}
結果: 11
12
10
12
4.static關鍵字加載順序問題:
靜態變量和靜態塊的加載都是在類加載器加載完成以后加載到一塊固定內存區,按代碼編寫的順序依次加載。
public class Father { static int i = 10;//先加載 static { System.out.println("初始化父類的靜態塊..."); }//后加載 public Father() { System.out.println("初始化父類的構造方法..."); } public static void speak(){ System.out.println("靜態方法..."); } public void speak1(){ System.out.println("普通方法..."); } } public class A extends Father { static { System.out.println("初始化子類靜態塊..."); } public A(){ System.out.println("初始化子類構造方法..."); } public static void main(String[] args) { System.out.println(Father.i); Father a = new A(); a.speak1(); } }
輸出結果: 初始化父類的靜態塊...
初始化子類靜態塊...
10
初始化父類的構造方法...
初始化子類構造方法...
普通方法...