一、靜態內部類的定義
靜態內部類是指在一個類中定義另一個靜態類,靜態類可以訪問外部類的靜態變量,但不能訪問非靜態變量。靜態內部類和外部類實例沒有直接的聯繫,就像是一個獨立的類一樣。在外部類的一個靜態方法中使用靜態內部類,可以省略外部類名,直接使用靜態內部類名。
public class OuterClass { private static int outerStaticVar; private int outerInstanceVar; public static class StaticInnerClass { private int innerVar; public void innerMethod() { outerStaticVar ++; } } public static void outerMethod() { StaticInnerClass staticInnerClass = new StaticInnerClass(); staticInnerClass.innerMethod(); } }
二、靜態內部類與封裝
靜態內部類可以幫助我們更好地實現封裝,對於一些只在外部類中使用的輔助類,我們可以將它們定義為外部類的靜態內部類,從而達到封裝的效果,避免了在外部類中暴露不必要的實現細節。
public class EncryptUtil { private static String salt; public static class MD5Encrypt{ public String encrypt(String message){ return MD5Util.encrypt(salt + message + salt); } } } EncryptUtil.MD5Encrypt encryptUtil = new EncryptUtil.MD5Encrypt(); encryptUtil.encrypt("hello world!");
三、靜態內部類和多態
靜態內部類可以被外部類的靜態方法和靜態屬性使用,因此可以作為靜態屬性的類型使用。靜態屬性的類型可以使用多態,因此當外部類有多個子類時,可以通過改變靜態屬性的具體類型從而實現多態。
public class CarFactory { public static abstract class Car { protected String name; protected String color; public abstract void run(); } public static class MercedesBenz extends Car { public MercedesBenz() { this.name = "MercedesBenz"; this.color = "black"; } public void run() { System.out.println(name + " is running."); } } public static class BMW extends Car { public BMW() { this.name = "BMW"; this.color = "white"; } public void run() { System.out.println(name + " is running."); } } private static Car car = new MercedesBenz(); public static Car getCar() { return car; } public static void main(String[] args) { Car car1 = CarFactory.getCar(); car1.run(); // 改變靜態屬性的類型 CarFactory.car = new BMW(); Car car2 = CarFactory.getCar(); car2.run(); } }
四、靜態內部類和Lambda表達式
Java 8引入了Lambda表達式,可以簡化事件監聽器、線程等代碼的編寫,而靜態內部類也可以幫助我們更好地使用Lambda表達式。
public class LambdaDemo { public static void main(String[] args) { List names = Arrays.asList("Alice", "Bob", "Charlie"); names.forEach(new Consumer() { @Override public void accept(String s) { System.out.println(s); } }); names.forEach(new PrintString()); } public static class PrintString implements Consumer { @Override public void accept(String s) { System.out.println(s); } } }
五、結語
本文詳細介紹了靜態內部類的定義、封裝、多態和Lambda表達式等幾個方面的作用。靜態內部類是一種實現封裝和多態的好方式,也可以幫助我們更加便捷地使用Lambda表達式等新特性。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/183048.html