一、靜態內部類什麼時候加載
靜態內部類是在外部類被加載的時候才會被加載。當我們使用外部類的靜態方法或靜態屬性時,內部類並不會被加載,只有調用靜態內部類的時候才被加載。因為靜態內部類是屬於外部類的一部分,所以外部類在被加載時它也會被一起加載。
二、靜態內部類實現單例模式
靜態內部類可以實現線程安全的單例模式,這是由於jvm保證了靜態內部類的線程安全性。我們可以在靜態內部類中定義一個私有的、靜態的外部類實例變量,然後通過getInstance()方法返回該外部類實例即可。
public class Singleton {
private Singleton() {}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
三、靜態內部類實例化
實例化靜態內部類不需要先創建外部類,可以直接創建靜態內部類的實例。在外部類中可以直接通過靜態內部類的類名訪問它的靜態方法和屬性。
public class OuterClass {
private static String name = "OuterClass";
private static class InnerClass {
public void printName() {
System.out.println("name: " + name);
}
}
public static void main(String[] args) {
InnerClass inner = new OuterClass.InnerClass();
inner.printName();
}
}
四、靜態內部類怎麼調用
在外部類中可以直接通過靜態內部類的類名訪問它的靜態方法和屬性,也可以通過創建靜態內部類實例的方式來訪問它的非靜態方法和屬性。
public class OuterClass {
private static String name = "OuterClass";
private static class InnerClass {
private String innerName = "InnerClass";
public void printNames() {
System.out.println("name: " + name);
System.out.println("innerName: " + innerName);
}
public static void printName() {
System.out.println("name: " + name);
}
}
public static void main(String[] args) {
InnerClass.printName(); //通過類名訪問靜態方法
InnerClass inner = new OuterClass.InnerClass();
inner.printNames(); //通過靜態內部類實例訪問非靜態方法和屬性
}
}
五、靜態內部類的作用
靜態內部類可以被看成是外部類的一個靜態成員,它可以訪問外部類的靜態成員和方法,但是外部類不能訪問靜態內部類的成員和方法。靜態內部類的作用主要包括:
- 實現單例模式
- 封裝數據結構或算法
- 優化代碼結構
六、內部類不能有靜態聲明
內部類可以包含靜態和非靜態的成員變量和方法,但是它本身不能聲明為static,因此內部類實例的生命周期和外部類實例綁定在了一起。如果一個內部類成員變量或方法需要在靜態上下文中使用,我們可以通過將它聲明為final和static來解決這個問題。
七、靜態內部類的線程安全
靜態內部類是線程安全的,這是因為在類加載的過程中,JVM並沒有允許多個線程同時進行類初始化,因此在保證線程安全的前提下,靜態內部類也可以實現延遲初始化,從而實現線程安全的單例模式。
八、內部類為什麼不能有靜態方法
內部類不能有靜態方法,因為內部類實例的生命周期和外部類實例綁定在了一起,如果內部類有靜態方法,它無法訪問外部類的非靜態成員和方法,這和內部類的定義是相悖的。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/259159.html