- Offer來了:Java面試核心知識點精講(原理篇)
- 王磊
- 1040字
- 2020-04-03 12:50:10
2.5 內部類
定義在類內部的類被稱為內部類。內部類根據不同的定義方式,可分為靜態內部類、成員內部類、局部內部類和匿名內部類這4種。
2.5.1 靜態內部類
定義在類內部的靜態類被稱為靜態內部類。靜態內部類可以訪問外部類的靜態變量和方法;在靜態內部類中可以定義靜態變量、方法、構造函數等;靜態內部類通過“外部類.靜態內部類”的方式來調用,具體的實現代碼如下:
public class OuterClass { private static String className ="staticInnerClass"; //定義一個靜態內部類 public static class StaticInnerClass { public void getClassName() { System.out.println("className:"+className ); } } public static void main(String[] args) { //調用靜態內部類 OuterClass.StaticInnerClass staticInnerClass = new OuterClass.StaticInnerClass(); staticInnerClass.getClassName(); } }
上面的代碼通過public static class StaticInnerClass{}代碼塊定義了一個靜態內部類StaticInnerClass,然后定義了靜態內部類的getClassName方法,在使用的過程中通過“外部類.靜態內部類”的方式進行調用,具體的實現代碼如下:
OuterClass.StaticInnerClass staticInnerClass = new OuterClass.StaticInnerClass()
這樣就定義一個靜態內部類并可以像普通類那樣調用靜態內部類的方法。
Java集合類HashMap在內部維護了一個靜態內部類Node數組用于存放元素,但Node數組對使用者是透明的。像這種和外部類關系密切且不依賴外部類實例的類,可以使用靜態內部類實現。
2.5.2 成員內部類
定義在類內部的非靜態類叫作成員內部類,成員內部類不能定義靜態方法和變量(final修飾的除外),因為成員內部類是非靜態的,而在Java的非靜態代碼塊中不能定義靜態方法和變量。成員內部類具體的實現代碼如下:
public class OutClass{
private static int a;
private int b;
//定義一個成員內部類
public class MemberInnerClass{
public void print() {
System.out.println(a);
System.out.println(b);
}
}
}
從上述代碼可以看到,在OutClass中通過public class MemberInnerClass定義了一個成員內部類,其使用方式和靜態內部類相同。
2.5.3 局部內部類
定義在方法中的類叫作局部內部類。當一個類只需要在某個方法中使用某個特定的類時,可以通過局部類來優雅地實現,具體的實現代碼如下:
public class OutClass {
private static int a;
private int b;
public void partClassTest(final int c) {
final int d = 1;
//在partClassTest方法中定義一個局部內部類PastClass
class PastClass{
public void print() {
System.out.println(c);
}
}
}
}
以上代碼在partClassTest方法中通過class PastClass{}語句塊定義了一個局部內部類。
2.5.4 匿名內部類
匿名內部類指通過繼承一個父類或者實現一個接口的方式直接定義并使用的類。匿名內部類沒有class關鍵字,這是因為匿名內部類直接使用new生成一個對象的引用。具體的實現代碼如下:
public abstract class Worker{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract int workTime();
}
public class Test {
public void test(Worker worker){
System.out.println(worker.getName() + "工作時間: " +
worker.workTime());
}
public static void main(String[] args) {
Test test = new Test();
//在方法中定義并使用匿名內部類
test.test(new Worker() {
public int workTime() {
return 8;
}
public String getName() {
return "alex";
}
});
}
}
在以上代碼中首先定義了一個抽象類Worker和一個抽象方法workTime,然后定義了一個Test類,在Test類中定義了一個方法,該方法接收一個Worker參數,這時匿名類需要的準備工作都已做好。在需要一個根據不同場景有不同實現的匿名內部類時,直接在test方法中新建匿名內部類并重寫相關方法即可。
- Spring 5.0 Microservices(Second Edition)
- C#高級編程(第10版) C# 6 & .NET Core 1.0 (.NET開發經典名著)
- Instant Testing with CasperJS
- INSTANT OpenCV Starter
- Java程序設計與計算思維
- SAP BusinessObjects Dashboards 4.1 Cookbook
- Python編程:從入門到實踐
- Scala程序員面試算法寶典
- iOS開發實戰:從入門到上架App Store(第2版) (移動開發叢書)
- Mastering Data Mining with Python:Find patterns hidden in your data
- 零基礎學Kotlin之Android項目開發實戰
- R Data Science Essentials
- UML基礎與Rose建模實用教程(第三版)
- 實戰Python網絡爬蟲
- Learning Dynamics NAV Patterns