一、靜態內部類的定義
靜態內部類是指在一個類中定義另一個靜態類,靜態類可以訪問外部類的靜態變量,但不能訪問非靜態變量。靜態內部類和外部類實例沒有直接的聯繫,就像是一個獨立的類一樣。在外部類的一個靜態方法中使用靜態內部類,可以省略外部類名,直接使用靜態內部類名。
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
微信掃一掃
支付寶掃一掃